这篇文章上次修改于 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
没有评论