1. git status:查看目前状态
  2. git add <文件名>:添加文件从工作区到暂存区
  3. git commit -m “提示信息”:从暂存区提交到代码仓库
  4. git log:查看提交commit的信息
  5. git push -u origin master:将本地的master分支推送到远程origin主机,-u参数表示记住对应关系,下次可以直接git push推送。
  6. git pull origin master:将远程主机origin的代码取回本地,与本地的master分支合并
  7. git diff HEAD:查看与上一次commit的区别
  8. //为当前分支打上版本号。
  9. git tag -a [VERSION] -m "released [VERSION]"
  10. $ git push origin [VERSION]

git add

git add命令用于将变化的文件,从工作区提交到暂存区。它的作用就是告诉 Git,下一次哪些变化需要保存到仓库区。用户可以使用git status命令查看目前的暂存区放置了哪些文件。

  1. # 将指定文件放入暂存区
  2. $ git add <file>
  3. # 将指定目录下所有变化的文件,放入暂存区
  4. $ git add <directory>
  5. # 将当前目录下所有变化的文件,放入暂存区
  6. $ git add .
  7. 参数
  8. -u参数表示只添加暂存区已有的文件(包括删除操作),但不添加新增的文件。
  9. $ git add -u
  10. -A或者--all参数表示追踪所有操作,包括新增、修改和删除。
  11. $ git add -A
  12. Git 2.0 版开始,-A参数成为默认,即git add .等同于git add -A
  13. -f参数表示强制添加某个文件,不管.gitignore是否包含了这个文件。
  14. $ git add -f <fileName>
  15. -p参数表示进入交互模式,指定哪些修改需要添加到暂存区。即使是同一个文件,也可以只提交部分变动。
  16. $ git add -p
  17. 注意,Git 2.0 版以前,git add默认不追踪删除操作。即在工作区删除一个文件后,git add命令不会将这个变化提交到暂存区,导致这个文件继续存在于历史中。Git 2.0 改变了这个行为。
  18. 实现细节
  19. 通过git add这个命令,工作区里面那些新建或修改过的文件,会加入.git/objects/目录,文件名是文件内容的 SHA1 哈希值。git add命令同时还将这些文件的文件名和对应的哈希值,写入.git/index文件,每一行对应一个文件。
  20. 下面是.git/index文件的内容。
  21. data/letter.txt 5e40c0877058c504203932e5136051cf3cd3519b
  22. 上面代码表示,data/letter.txt文件的哈希值是5e40c087...。可以根据这个哈希值到.git/objects/目录下找到添加后的文件。

git branch

git branch是分支操作命令。

  1. # 列出所有本地分支
  2. $ git branch
  3. # 列出所有本地分支和远程分支
  4. $ git branch -a
  5. 1)新建一个分支
  6. 直接在git branch后面跟上分支名,就表示新建该分支。
  7. $ git branch develop
  8. 新建一个分支,指向当前 commit。本质是在refs/heads/目录中生成一个文件,文件名为分支名,内容为当前 commit 的哈希值。
  9. 注意,创建后,还是停留在原来分支,需要用git checkout切换到新建分支。
  10. $ git checkout develop
  11. 使用-b参数,可以新建的同时,切换到新分支。
  12. $ git checkout -b NewBranch MyBranch
  13. 2)删除分支
  14. -d参数用来删除一个分支,前提是该分支没有未合并的变动。
  15. $ git branch -d <分支名>
  16. 强制删除一个分支,不管有没有未合并变化。
  17. $ git branch -D <分支名>
  18. 3)分支改名
  19. $ git checkout -b twitter-experiment feature132
  20. $ git branch -d feature132
  21. 另一种写法
  22. # 为当前分支改名wo
  23. $ git branch -m twitter-experiment
  24. # 为指定分支改名
  25. $ git branch -m feature132 twitter-experiment
  26. # 如果有重名分支,强制改名
  27. $ git branch -m feature132 twitter-experiment
  28. 4)查看 merge 情况
  29. # Shows branches that are all merged in to your current branch
  30. $ git branch --merged
  31. # Shows branches that are not merged in to your current branch
  32. $ git branch --no-merged
  33. 命令行参数
  34. -d
  35. -d参数用于删除一个指定分支。
  36. $ git branch -d <branchname>

git checkout

  1. git checkout命令有多种用途。
  2. 1)用来切换分支。
  3. $ git checkout
  4. 上面命令表示回到先前所在的分支。
  5. $ git checkout develop
  6. 上面命令表示切换到develop分支。
  7. 2)切换到指定快照(commit
  8. $ git checkout <commitID>
  9. 3)将工作区指定的文件恢复到上次commit的状态。
  10. # 将指定文件从暂存区复制到工作区,
  11. # 用来丢弃工作区对该文件的修改
  12. $ git checkout -- <filename>
  13. # 还可以指定从某个 commit 恢复指定文件,
  14. # 这会同时改变暂存区和工作区
  15. $ git checkout HEAD~ -- <filename>
  16. -p参数表示进入交互模式,只恢复部分变化。
  17. $ git checkout -p
  18. 4)切换到某个tag
  19. $ git checkout tags/1.1.4
  20. # 或者
  21. $ git checkout 1.1.4
  22. 上面第二种用法的前提是,本地不能有叫做1.1.4的分支。
  23. 参数
  24. -b用于生成一个新的分支。
  25. $ git checkout -b new

git commit

git commit命令用于将暂存区中的变化提交到仓库区。

  1. -m参数用于指定 commit 信息,是必需的。如果省略-m参数,git commit会自动打开文本编辑器,要求输入。
  2. $ git commit -m "message"
  3. git commit命令可以跳过暂存区,直接将文件从工作区提交到仓库区。
  4. $ git commit <filename> -m "message"
  5. 上面命令会将工作区中指定文件的变化,先添加到暂存区,然后再将暂存区提交到仓库区。
  6. 命令行参数
  7. -a
  8. -a参数用于先将所有工作区的变动文件,提交到暂存区,再运行git commit。用了-a参数,就不用执行git add .命令了。
  9. $ git commit -am "message"
  10. 如果没有指定提交说明,运行下面的命令会直接打开默认的文本编辑器,让用户撰写提交说明。
  11. $ git commit -a
  12. allow-empty
  13. --allow-empty参数用于没有提交信息的 commit
  14. $ git commit --allow-empty
  15. amend
  16. --amend参数用于撤销上一次 commit,然后生成一个新的 commit
  17. $ git commit --amend - m "new commit message"
  18. fixup
  19. --fixup参数的含义是,当前添加的 commit 是以前某一个 commit 的修正。以后执行互动式的git rebase的时候,这两个 commit 将会合并成一个。
  20. $ git commit --fixup <commit>
  21. 执行上面的命令,提交说明将自动生成,即在目标 commit 的提交说明的最前面,添加“fixup! ”这个词。
  22. -m
  23. -m参数用于添加提交说明。
  24. $ git commit -m "message"

git diff

git diff命令用于查看文件之间的差异。

  1. # 查看工作区与暂存区的差异
  2. $ git diff
  3. # 查看某个文件的工作区与暂存区的差异
  4. $ git diff file.txt
  5. # 查看暂存区与当前 commit 的差异
  6. $ git diff --cached
  7. # 查看两个commit的差异
  8. $ git diff <commitBefore> <commitAfter>
  9. # 查看暂存区与仓库区的差异
  10. $ git diff --cached
  11. # 查看工作区与上一次commit之间的差异
  12. # 即如果执行 git commit -a,将提交的文件
  13. $ git diff HEAD
  14. # 查看工作区与某个 commit 的差异
  15. $ git diff <commit>
  16. # 显示两次提交之间的差异
  17. $ git diff [first-branch]...[second-branch]
  18. # 查看工作区与当前分支上一次提交的差异,但是局限于test文件
  19. $ git diff HEAD -- ./test
  20. # 查看当前分支上一次提交与上上一次提交之间的差异
  21. $ git diff HEAD -- ./test
  22. # 生成patch
  23. $ git format-patch master --stdout > mypatch.patch
  24. 比较两个分支
  25. # 查看topic分支与master分支最新提交之间的差异
  26. $ git diff topic master
  27. # 与上一条命令相同
  28. $ git diff topic..master
  29. # 查看自从topic分支建立以后,master分支发生的变化
  30. $ git diff topic...master

git log

git log命令按照提交时间从最晚到最早的顺序,列出所有 commit。

  1. # 列出当前分支的版本历史
  2. $ git log
  3. # 列出某个文件的版本历史,包括文件改名
  4. $ git log --follow [file]
  5. 查看远程分支的变动情况。
  6. $ git log remote/branch
  7. 查找log,即搜索commit信息。
  8. $ git log --author=Andy
  9. $ git log -i --grep="Something in the message"
  10. 上面代码中,-i参数表示搜索时忽略大小写。
  11. 查看某个范围内的commit
  12. $ git log origin/master..new
  13. # [old]..[new] - everything you haven't pushed yet
  14. 美化输出。
  15. git log --graph --decorate --pretty=oneline --abbrev-commit
  16. graph commit之间将展示连线
  17. decorate 显示commit里面的分支
  18. pretty=oneline 只显示commit信息的标题
  19. abbrev-commit 只显示commit SHA1的前7

git merge

将当前分支合并到指定分支。

  1. $ git merge develop
  2. 将当前分支与develop分支合并,产生的新的commit对象有两个父节点。
  3. 如果“指定分支”本身是当前分支的一个直接子节点,则会产生fast-forward合并,即合并不会产生新的节点,只是让当前分支指向“指定分支”的最新commit
  4. Git合并所采用的方法是Three-way merge,及合并的时候除了要合併的兩個檔案,還加上它们共同的父节点。这样可以大大減少人為處理 conflict 的情況。如果采用two-way merge,則只用兩個檔案進行合併(svn默认就是这种合并方法。)

git pull

合并指定分支到当前分支

  1. $ git pull . topic/branch
  2. 即使当前分支有没有 commit 的变动,也可以使用git pull从远程拉取分支。

git reset

git reset命令用于将当前分支指向另一个位置。

  1. # 将当期分支的指针倒退三个 commit,
  2. # 并且会改变暂存区
  3. $ git reset HEAD~3
  4. # 倒退指针的同时,不改变暂存区
  5. $ git reset --soft HEAD~3
  6. # 倒退指针的同时,改变工作区
  7. $ git reset --hard HEAD~3
  8. 如果不指定回滚的位置,那么等同于撤销修改。
  9. # 撤销上一次向暂存区添加的所有文件
  10. $ git reset
  11. # 无任何效果
  12. $ git reset --soft
  13. # 同时撤销暂存区和工作区的修改,
  14. # 回复到上一次提交的状态
  15. $ git reset --hard
  16. # 撤销上一次向暂存区添加的某个指定文件,
  17. # 不影响工作区中的该文件
  18. $ git reset -- <filename>
  19. 参数
  20. soft: 不改变工作区和缓存区,只移动 HEAD 到指定 commit
  21. mixed: 只改变缓存区,不改变工作区。这是默认参数,通常用于撤销git add
  22. hard:改变工作区和暂存区到指定 commit。该参数等同于重置,可能会引起数据损失。git reset --hard等同于git reset --hard HEAD
  23. -p表示键入交互模式,指定暂存区的哪些部分需要撤销。
  24. # Undo add
  25. $ git reset
  26. # Undo a commit,不重置工作区和缓存区
  27. # 回到 HEAD 之前的那个 commit
  28. $ git reset --soft HEAD^
  29. # Undo a commit,重置工作区和缓存区
  30. # 连续撤销三个 commit:HEAD, HEAD^, and HEAD~2
  31. $ git reset --hard HEAD~3
  32. # 从暂存区移除指定文件,但不改变工作区中的该文件
  33. $ git reset -- frotz.c

git revert

git revert命令用于撤销commit。

  1. $ git revert <commitID>

git rm

git rm命令用于删除文件。

  1. 解除追踪某个文件,即该文件已被git add添加,然后抵消这个操作。
  2. $ git rm --cached <fileName>

git show

git show命令用于查看commit的内容

  1. # 输出某次提交的元数据和内容变化
  2. $ git show [commit]
  3. $ git show 12a86bc38 # By revision
  4. $ git show v1.0.1 # By tag
  5. $ git show feature132 # By branch name
  6. $ git show 12a86bc38^ # Parent of a commit
  7. $ git show 12a86bc38~2 # Grandparent of a commit
  8. $ git show feature132@{yesterday} # Time relative
  9. $ git show feature132@{2.hours.ago} # Time relative

git tag

git tag命令用于为 commit 打标签。Tag 分两种:普通tag和注解tag。只有annotated tag 才會產生 object。

  1. $ git tag tmp # 生成.git/refs/tags/tmp
  2. $ git tag -a release
  3. $ git tag -a [VERSION] -m "released [VERSION]"
  4. 上面代码表示为当前commit打上一个带注解的标签,标签名为release
  5. 普通标签的写法。
  6. $ git tag 1.0.0
  7. $ git push --tags
  8. $ git tag v0.0.1
  9. $ git push origin master --tags