这篇文章上次修改于 380 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

1. 配置

# 设置用户名
git config --global user.name

# 设置命令别名
# 用 git b 代替 git branch
git config --global alias.b branch

2. 概念

在 working directory 编辑代码,git add 将改动加入到 stage area,git commit 将改动提交到本地仓库,git push 将改动提交到远程仓库。

3. 保存改变 git stash

stash 实际上是将仓库编码为提交记录对象。.git/refs/stash 指向最近的 stash。

# 为 stash 起个名
git stash save "add style to our site"

# 列出所有的 stash
git stash list

# 重放最近的 stash
# 重放后的 stash 不会被马上删除,而是等下次 git 垃圾回收时删除
git stash pop

# 重放特定的 stash
git stash pop stash@{2}

# 总览所有 stash 与目前文件的差异
git stash show

# 查看 stash 与目前文件的具体差异
git stash show -p

# 根据 stash 创建新的分支
git stash branch add-stylesheet stash@{1}

# 清空某个 stash
git stash drop stash@{1}

# 清空所有 stash
git stash clear

# 将被忽略的文件也包含进来
git stash --all

4. 查看仓库

4.1. git log

# 每条提交记录都以一行呈现
git log --oneline

# 显示哪些文件有变动
git log --stat

# 显示每条提交的 diff
git log -p

# 只显示包含某文件的提交记录
git log <file>

# 绘制提交记录的图,效果类似 tig 命令
git log --graph --decorate --oneline

# 取出某分支与 master 分支间所有不同的提交记录
git log --oneline master..some-feature

4.2. git tag

# 打标签
git tag -a v1.4 -m "my version 1.4"

# 打轻量标签
git tag v1.4-lw

# 查看标签
git tag

# 找到某条记录后,为某条记录打标签
git log --pretty=oneline
git tag -a v1.2 15027957951b64cf874c3557a0f3547bd83b3ff6

# 将标签推送到远程仓库,如果推送多个标签,需加上 --tags 选项
git push origin v1.4

# checkout 到某个标签
git checkout v1.4

# 删除某个标签
git tag -d v1

4.3. git blame

# 查看某文件的具体信息,每一行被谁修改,修改时间,提交记录,被修改的内容
git blame <file>

# 显示时,以作者的 email 代替用户名
git blame <file>

5. 撤销修改

git revert  会添加一条新的提交记录。可以提交到远程仓库。
git reset --hard  只保留撤销前的记录。不能提交到远程仓库,会报错,因为缺失了一些 commit。
git commit --amend  修改最近一次提交记录。
git clean  可以撤销 working directory 的内容。

git reset --hard  撤销 Commit History,Staging Index,Working Directory
git reset --mixed  是默认的,撤销 Commit History,Staging Index
git reset --soft  撤销 Commit History

不要 git reset 公共分支。

git reset <file>  撤销指定文件

git rm <file>  作用于 working directory 和 staging index

6. 重写历史

git commit --amend  修改最近一次提交。git commit --amend 公共分支
git commit --amend --no-edit  将修改加到最近一次提交中

git rebase -i  修剪不必要的提交

git reflog  如果重写历史,可通过 git reflog 查看,并通过 git reset --hard 撤销重写。git reflog 默认过期时间为 90 天

7. Merging vs. Rebasing

自己基于 master 新开的分支为 feature,如果在合并到 master 之前,master 上已经有了别人的新的提交,这时将自己的 feature 合并到 master 上有 2 种做法。
做法 1:直接 merge

git checkout master
git pull origin master
git merge master feature
git push master

git merge master feature
相当于:
git checkout master
git merge feature

做法 2:先 rebase,后 merge

git checkout master
git pull origin master
git checkout feature
git rebase master
git merge master feature
git push master

做法 1 解决的冲突数比较少,做法 2 可能需要解决多次冲突,因为 rebase 会将 master 的新 commit 在 feature 的每次 commit 中重放。但是做法 2 可使得提交记录为一条线。

8. 下载所有子模块

git submodule update --init --recursive

参考

  1. https://www.atlassian.com/git/tutorials