git学习整理

[TOC]

概念

  • 工作区:就是电脑上看到的目录
  • 版本库:工作区有一个隐藏的.git目录,这个不算工作区,而是git的版本库
  • 暂存区:git的版本库里面存了很多东西,其中最重要的就是stage(或者叫index)的暂存区.
    git add 就是将文件提交到暂存区
    git commit 就是将暂存区的修改提交到当前分支

设置

git config

  • git config --global user.name userName 设置全局用户名
    *不加 --global选项就不是全局 指当前项目
  • git config --global user.email [email protected] 设置全局邮箱
  • git config 命令会将设置信息输出到.gitconfig中,格式:
name=userName
[email protected]
  • 也可以使用GIT_AUTHOR_NAME和GIT_AUTHOR_EMAIL环境变量来告诉git
  • 将color.ui设为auto可以让命令可读性更好
    git config --global color.ui auto
  • 在github上链接已有仓库时的认证,是通过使用ssh的公开密匙认证的方式.
  1. ssh-keygen -t rsa -C "[email protected]"
  2. id_rsa文件是私匙,id_rsa.pub是公开密匙
  3. 在github上添加公开密匙,以后即就可以用私匙认证了
  • export GIT_EDITOR=vim 设置默认的编辑器

基本命令

git

  • 不带参数的git会列出git的选项和最常用的子命令
  • 要得到一个完整的git子命令列表可以使用
    git help --all

git clone urlPath 获取远程仓库到本地

git branch 显示分支一览表

  • git branch -a 查看当前分支的相关信息,-a选项可以同时显示本地和远程仓库的分支信息.
  • -d选项 删除分支 例如:git branch -d dev删除dev分支 .
    如果遇到没有合并的分支会有警告信息,使用大写的-D选项删除分支
  • git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联

git init (初始化本地仓库,将当前文件夹变成git版本库)

git add (将文件添加到本地仓库,提交到暂存区)

git commit (将暂存区的内容提交到本地版本库)

  • -m 选项 后面跟本地提交的备注
    • 示例:git commit -m 'this is the first commit'
  • 不加-m选项就会打开默认的编辑器提交更加详细的内容.标准提交格式如下:
    L1:用一行文字简述提交的内容
    L2:空行
    L3:记录更改的原因和详细内容
    
  • git commit --am 一次完成两步操作. 合并add和commit操作.
  • 如果合并的时候有冲突,手工编辑后先add之后commit

git log (查看日志,最新的在前)

  • --pretty=oneline 参数显示简要信息
  • git log 后加上目录名 显示目录的日志 跟文件名显示文件的日志
  • -P 选项,会显示文件提交前后的差别
  • --graph 以图表形式查看分支
  • git log --follow mydata 显示内容先关联的整个历史记录

git status (查看当前git状态)

git diff 查看更改前后的差别(当前工作区与暂存区的差别)

  • 后面加 fileName(查看文件的不同,当前版本和上一个版本的差别,主要用来查看修改内容)
    • git diff HEAD -- readme.txt 可以查看工作区和版本库里面最新版本的区别
  • git diff 对比两个提交码对应版本的差别
  • git diff --cached 显示已经暂存未提交的差异

git show 查看提交的详细信息

  • git show 查看特定提交的详细信息.不加提交码,显示最近一次提交的详细信息.
  • git show-branch --more=10 提供当前分支简洁的单行摘要. --more选项 表示额外的10个版本

git reflog (显示当前仓库的操作历史日志)

git reset --hard HEAD^ 回退到上一个版本 hard 后面可以跟commit id 回退到指定版本

git checkout master 切换分支

  • 连字符"-"代替分支名就可以切换到上一个分支 示例:git checkout -
  • -b选项,创建并切换分支 示例:git checkout -b dev
  • git checkout -b dev origin/dev获取远程dev分支在本地创建dev分支并切换.
  • git checkout 后面跟文件名,丢弃工作区的修改.示例:
    git checkout --readme.txt
  • 丢弃工作区的修改.有以下两种情况:
    • 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
    • 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
    • 总之,就是让这个文件回到最近一次git commit或git add时的状态。
  • git reset HEAD file 可以把暂存区的修改撤销掉(unstage),重新放回工作区
    • git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

git rebase -i 压缩历史

  • git rebase -i HEAD -2 选定当前分支中包含HEAD(最新提交)在内的两个最新的历史记录为对象,并在编辑器中打开.

git remote add 添加远程仓库

  • 示例:git remote add origin [email protected]:xxx.git将远程仓库关联到本地仓库
  • git remote -v 显示远程的详细信息

git push 推送至远程仓库

  • git push -u origin master -u选项可以在推送的同时,将origin仓库的master分支设置为本地当前分支的upstream(上游),
    加这个参数以后运行git pull时,本地分支就可以直接从origin的master获取内容.

git merge 合并分支

  • 示例:
    git checkout master \\切换当前分支为master
    git merge dev \\将dev分支的内容合并到master(当前分支)
  • --no-ff选项 禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息

git pull 获取最新的远程仓库

  • git pull origin dev

git rm 删除文件

  • 示例:
git rm demo.txt
git commit -m "remove a demo.txt"
  • git rm --cached 将一个文件由已暂存变成未暂存,git rm --cached 会删除索引中的文件并把它保存在工作区中.
  • 如果想移除一个已提交的文件 使用git rm filename命令来暂存这一请求.

git stash 把当前工作现场“储藏”起来,等以后恢复现场后继续工作

$ git stash list
stash@{0}: WIP on dev: 6224937 add merge

查看工作现场

  • 恢复有两个办法:
  • 一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
  • 另一种方式是用git stash pop,恢复的同时把stash内容也删了.
    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
    另一种方式是用git stash pop,恢复的同时把stash内容也删了:
  • 可以多次stash,恢复的时候可以恢复指定的stash,命令:
git stash apply stash{0}

标签

git tag 打一个新标签

  • git tag 查看所有标签,按照字母顺序显示,不是时间顺序
  • 默认是打在最新的commit上
  • git tag 将标签打在指定的commit上
  • 创建带有说明的标签:用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 3628164

用命令git show 可以看到说明文字

操作标签

  • git tag -d v0.1 删除标签
  • 推送某个标签到远程 git push origin
  • 或者,一次性推送全部尚未推送到远程的本地标签:
    git push origin --tags
  • 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9

然后,从远程删除。删除命令也是push,但是格式如下:

 git push origin :refs/tags/v0.9

使用习惯

合作模式

  • 首先,可以试图用git push origin branch-name推送自己的修改;
    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    如果合并有冲突,则解决冲突,并在本地提交;
    没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,
    用命令git branch --set-upstream branch-name origin/branch-name

解决冲突

  • 手工处理冲突后 执行git add 清除冲突状态
  • 终止合并 git reset --hard HEAD 这条命令把工作目录和索引都还原到git merge之前
  • 如果要终止或者放弃:git reset --hard ORIG_HEAD
  • 如果已经把解决冲突搞砸,想返回到尝试解决前的原始冲突状态,可以使用git checkout -m命令

三个重要的命令

  1. git reset
    • git reset 会把版本库和工作目录改变为commitId指定的版本
    • git reset 是破坏型的,因为它可以覆盖销毁工作目录中的修改.这个命令的重点是为HEAD,索引和工作目录建立与恢复已知状态.
    • git reset 有三个选项: --soft,--mixed,--hard
      1. git reset-soft提交
        --soft会将HEAD指向给定的提交.索引和工作目录的内容不变."最小"影响,只改变一个符号引用的状态,使其指向一个提交
      2. git reset--mixed提交
        --mixed会将HEAD指向给定的提交.索引内容跟着改变,但是工作目录中的内容不变.将索引变成刚暂存该提交时的状态,它会显示工作目录中还有什么修改.
        --mixed是git reset的默认模式
      3. git reset--hard提交
        将HEAD引用指向给定的提交.索引内容和工作目录的内容都随之改变.做的修改都将丢失,新文件被删除,之前被删除的文件会恢复回来.
  2. git cherry-pick
    • git cherry-pick 会在当前分支上应用指定commitId版本的变更.这将引入一个新的独特的提交.试用cherry-pick并不改变版本库的现有历史记录,而是添加历史记录.
    • 你可能需要解决冲突来完全应用指定版本的变更.
    • git cherry-pick 通常用于把版本库中一个分支的特定提交引入一个不同的分支中.常见的用法是把维护分支的提交移植到开发分支.
    • git cherry-pick 的另一个常见用途是重建一系列提交,通过从一个分支选一批提交,然后把它们引入一个新的分支.
  3. git revert
    • git revert 跟git cherry-pick大致相同,区别是它应用指定版本的逆过程.此命令用于引入一个新提交来抵消指定版本的影响.
    • 跟git cherry-pick一样,revert不修改版本库历史记录,相反它往历史记录中添加新的提交.
    • git revert常见的用途是"撤销"可能深埋在历史记录中的某个提交的影响.

如何跟fork的主仓库保持同步

- git remote add upstream ’clone地址‘  保持和原始库的关联
- git fetch upstream  从原始库获取最新的更新
- git remote  查看有哪些可以同步的原始库

你可能感兴趣的:(git学习整理)