本文总结了git中最常用的命令。
基本用法
上面五条命令在工作目录、暂存目录和本地仓库之间修改文件。
git add files
把当前工作目录下files的修改放到暂存目录,git add .
将所有修改加入暂存目录。git commit -m "xxx"
将暂存目录生成快照并提交到本地仓库,提交的信息为xxx。git reset --soft HEAD^
用来撤销最后一次commit
的所有文件,回到暂存目录。git checkout -- files
把文件从暂存目录撤回到工作目录,用来丢弃本地修改。
命令解释
git diff
有时需要查看两次提交之间的变动。
git diff
相对于暂存目录,查看本地目录的变动。git diff --cached
相对于本地仓库,查看暂存目录的变动。git diff HEAD
相对于本地仓库,查看本地目录的变动。git diff b325c da985
查看b325c
和da985
两次提交之间的改动。
git commit --amend
如果想更改上一次提交,使用git commit --amend
。git会使用与当前节点相同的父节点进行一次新的提交,上一次的提交会被取消,但是内容存在。该命令也可以用于修改上一次提交信息。
git cherry-pick
git cherry-pick commitID
命令表示将commitID这个提交节点在当前分支做一次完全一样的提交。
在main分支
操作git cherry-pick 2c33a
,将topic分支
中2c33a
这笔提交copy过来。
git rebase
git rebase
是不同于git merge
的一种合并命令。git merge
合并是把两个父分支合并进行一次新提交,提交历史不是线性的。而git rebase
衍合在当前分支上重演另外一个分支的所有历史提交,提交历史是线性的,本质上,这是线性的自动化cherry-pick
操作。
git merge
在main
分支的ed489
节点进行git merge other
操作,将当前提交ed489
和other
分支的提交,以及他们的共同祖父节点b325c
进行一次三方合并。结果是先保存工作目录和暂存区域,然后做一次新提交f8bc5
。git rebase
在topic
分支进行git rebase main
操作,在公共祖父节点处重演main
分支中三次提交b325c
,c10b9
,da985
,形成线性的提交。
同样,git rebase -i HEAD~n
可以让你更加方便地完成一些复杂的操作,比如丢弃、重排、修改、合并最后n次提交。
git log
git log
git log -p
git log --oneline
git reflog
用git log
可以查看详细的提交历史,用git log -p
可以查看详细的提交历史和每次提交的修改内容,用git log --oneline
可以查看简略的提交历史。HEAD指向的提交就是当前的提交,因此使用命令git reset --hard commitID
可以让我们在所有的历史提交之间切换。如果不小心切回到某个历史提交,那么如何切回未来的某个提交呢?要重返未来,用git reflog
查看历史提交,以便确定要回到未来的哪个提交。
git stash
有时,当你在工作目录修改了一些文件,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情(比如处理紧急的bug)。 问题是,你不想为做了一半的工作创建一次提交。 针对这个问题的答案是 git stash 命令。
贮藏(stash)会处理工作目录的脏的状态——即跟踪文件的修改与暂存的改动——然后将未完成的修改保存到一个栈上, 而你可以在任何时候重新应用这些改动(甚至在不同的分支上)。
- 暂存现状
git stash # 直接添加到栈上
git stash save "tips info" # 添加到栈上并添加了提示信息
- 显示暂存
git stash list
- 恢复暂存
git stash pop # 恢复到最新的操作,list中就不存在该stash了
git stash pop stash@{num} # 恢复指定的stash
git stash apply # 恢复到最新的操作,list中就还存在该stash
git stash apply stash@{num} # 恢复指定的stash
使用场景
开发流程
开发时,通常新建一个dev
分支,修改代码,然后将修改的代码合并到master
分支上,再用master
分支提交代码和远程仓库同步。这样的好处是每次合并到master
分支前可以git pull
更新,然后再merge
,不容易出错,提交的历史比较漂亮,即使有紧急的bug,在master
分支新建一个bug
分支进行处理就可以了,不影响dev
分支的开发。
git checkout -b dev
# coding->add->commit
git checkout master
git pull
git checkout dev
git rebase master
git checkout master
git merge dev
git push
打patch
假如客户有一个紧急的bug需要解决,此时需要修改代码后,提供一份patch给客户马上可以使用。
用git diff
生成的标准patch。
git diff > xxx.patch # 生成patch
# 将xxx.patch提供给客户,客户打上该patch立马修复bug
git apply xxx.patch # 应用patch
要生成两个commit之间的patch,也可以使用git diff命令实现。
git diff commit-old commit-new > old2new.patch
最好在添加更改文件的before和after版本,以防客户的仓库版本和你本地的仓库版本不一致,打不上patch,此时就可以用对比工具看具体的改动,直接添加。
- before表示修改前的文件
- after表示修改后的文件
配置别名
配置别名,可以偷懒少敲几个字母。
git config --global alias.co checkout
git config --global alias.st status
git config --global alias.cm commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
简化后的指令:
git co
git st
git cm
git br
git unstage
git last
git lg
参考:
图解Git