GitPro摘录

只会用add, commit, push, pull, checkout, reset, merge, stash. 重新系统的学一下Git. 因此这里只记录我认为我不清楚的部分.
之前在某个图形化学git的网站学过rebase, cherry-pick之类的命令, 不过生产实践中基本没用过, 荒废了.
现在在GitPro中重新整理学习一下这些命令.

1. Git基础

  • git status -s: 简化的git status, 只显示状态, 不显示详细信息.

  • .gitignore:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 忽略所有的 .a 文件
*.a

# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a

# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO

# 忽略任何目录下名为 build 的文件夹
build/

# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt

# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

一个针对不同语言的.gitignore示例:https://github.com/github/gitignore

  • git rm: 从工作目录中删除文件, 并将这次删除放入暂存区. 在git目录下删除文件, 需要使用git rm 来代替 rm.
    • git rm --cached: 只在版本库中删除文件, 但是在本地仍然存在.
  • git mv: 重命名文件, 并将这次重命名放入暂存区. 在git目录下重命名文件, 需要使用git mv 来代替 mv.
  • git log -S function_name: 查找引入function_name的commit.
  • git commit --amend: 撤销上一次的提交操作, 并将暂存区的文件重新提交. 用于修改上一次提交的注释, 或者漏掉的文件.
1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
  • git reset HEAD file: 撤销暂存区的file文件.
  • git checkout – file: 撤销工作目录的file文件. 取消本地对file文件所做的一切修改.

2. 分支

  • fast-forward: 当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
  • git branch:
    • git branch -d: 删除分支(已合并)
    • git branch -D: 强制删除, 哪怕那个分支上的工作没有合并过.
    • git branch --merged: 查看已经合并到当前分支的分支. 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
  • git pull: git pull == git fetch && git merge. 由于 git pull 的魔法经常令人困惑所以通常单独显式地使用 fetch 与 merge 命令会更好一些。
  • git push --delete: 删除远程分支.
  • git rebase: 为了确保在向远程分支推送时能保持提交历史的整洁.
    • git rebase --onto: 从一个分支上取出一系列的提交, 并在另一个分支上重新应用.

3. 分布式Git

  • 集中式工作流: 有一个中央仓库, 所有的开发者都从中央仓库clone代码, 然后将代码push到中央仓库.

  • 集成管理者工作流: 有一个中央仓库, 所有的开发者都从中央仓库clone代码, 然后将代码push到中央仓库. 但是有一个人负责合并代码, 他会从中央仓库clone代码, 然后将代码push到中央仓库. 也是现在大部分GitHub项目的工作流.

  • 主管与副主管工作流: 有一个中央仓库, 所有的开发者都从中央仓库clone代码, 然后将代码push到中央仓库. 但是有一个人负责合并代码, 他会从中央仓库clone代码, 然后将代码push到中央仓库. 但是他会将代码push到另一个仓库, 然后副主管从这个仓库clone代码, 然后将代码push到中央仓库. 应用于大型GitHub项目, 比如Linux内核.

  • git diff --check: 检查代码中的空白错误.

  • git add --patch: 部分暂存文件.

  • git apply: 应用补丁.

    • git apply --check: 检查补丁能否应用.
  • git am: 应用邮件补丁.

    • git am -3: 3方合并.