Git操作指南
整理的一些Git
常用命令,以及进阶命令git rebase
,从这里你可以学到基础的Git
配置命令、分支管理、fetch
指令、git
撤销、状态查询、文档查询、文件暂存、差异比较、基本操作、git
进阶之rebase
配置命令
列出当前配置
1 | git config --list |
列出Repository
配置
1 | git config --local --list |
列出全局配置
1 | git config --global --list |
列出系统配置
1 | git config --system --list |
配置用户名
1 | git config --global user.name "your name" |
配置用户邮箱
1 | git config --global user.email "youremail@github.com" |
分支管理
查看本地分支
1 | git branch |
查看远程分支
1 | git branch -r |
查看本地和远程分支
1 | git branch -a |
从当前分支切换到其它分支
1 | git checkout <branch-name> |
创建并切换到新分支
1 | git checkout -b <branch-name> |
删除分支
1 | git branch -d <branch-name> |
当前分支与指定分支合并
1 | git merge <branch-name> |
查看哪些分支已经/没有合并到当前分支
1 | git branch --merged |
查看各个分支最后一个提交对应的信息
1 | git branch -v |
删除远程分支
1 | git push origin -d <branch-name> |
重命名分支
1 | git branch -m <oldbranch-name> <newbranch-name> |
拉取远程分支并创建本地分支
1 | git checkout -b 本地分支名 origin/远程分支名 |
fetch指令
将远程仓库的内容更新到本地
1 | git fetch origin <branch-name>:<local-branch-name> |
- 一般而言,这个origin是远程主机名,一般默认就是origin。
branch-name
你要拉取的分支local-branch-name
通常而言,就是你本地新建一个新分支,将origin下的某个分支代码下载到本地分支。
将某个远程主机的更新,全部取回本地
1 | git fetch <远程主机名> |
取回特定分支
1 | git fetch <远程主机名> <分支名> |
将某个分支的内容取回到本地的某个分支
1 | git fetch origin :<local-branch-name> |
git撤销
撤销工作区修改
1 | git checkout-- |
暂存区文件撤销(不覆盖工作区)
1 | git reset HEAD |
版本回退
git reset –(soft|mixed|hard) <HEAD~(num)> |
指令 | 作用范围 |
---|---|
–hard | 回退全部,包括HEAD,index,working,tree |
–mixed | 回退部分,包括HEAD,index |
–soft | 只回退HEAD |
状态查询
查看状态
1 | git status |
查看历史操作记录
1 | git reflog |
查看日志
1 | git log |
文档查询
展示Git命令大纲
1 | git help (--help) |
展示Git命令大纲全部列表
1 | git help -a |
展示具体命令说明手册
1 | git help |
文件暂存
添加改动到stash
1 | git stash sava -a "message" |
删除暂存
1 | git stash drop stash@{ID} |
查看stash列表
1 | git stash list |
删除全部缓存
1 | git stash clear |
恢复改动
1 | git stash pop stash@{ID} |
差异比较
比较工作区与缓存区
1 | git diff |
比较缓存区与本地库最近一次commit内容
1 | git diff --cached |
比较工作区与本地最近一次commit内容
1 | git diff HEAD |
比较两个commit之间的差异
1 | git diff |
基本操作
创建本地仓库
1 | git init |
链接本地仓库与远程仓库
1 | git remote add origin |
检查配置信息
1 | git config --list |
Git user name and email
1 | git config --global user.name "yourname" |
生成SSH秘钥
1 | ssh-keygen -t rsa -C "youremail" |
查看远端仓库信息
1 | git remote -v |
远端仓库重新命名
1 | git remote rename old new |
提交到缓存区
1 | git add . 全部文件 |
提交到本地仓库
1 | git commit -m "message" |
提交到远程仓库
1 | git push <远程主机名> <本地分支名>:<远程分支名> |
git 进阶之rebase
Rebase场景一:如何合并多次提交记录
合并最近的n次提交记录
Git Bash/Shell 1
git rebase -i HEAD~n
进入vi编辑模式
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
如果保存的时候,出错
JavaScript 1
error: cannot 'squash' without a previous commit
注意不要合并先前提交的东西,也就是已经提交远程分支的纪录。
如果你异常退出了
vi
窗口Git Bash/Shell 1
git rebase --edit-todo
这时候会一直处在这个编辑的模式里,我们可以回去继续编辑,修改完保存一下
Git Bash/Shell 1
git rebase --continue
查看结果
Git Bash/Shell 1
git log
Rebase场景二:分支合并
我们先从
master
分支切出一个dev
分支,进行开发:Git Bash/Shell 1
git checkout -b feature
这时候,你的同事完成了一次
hotfix
,并合并入了master
分支,此时master
已经领先于你的feature
分支了恰巧,我们想要同步
master
分支的改动,首先想到了merge
让我们来试试
git rebase
而不是使用mergeGit Bash/Shell 1
git rebase master
首先,
git
会把feature
分支里面的每个commit
取消掉;
其次,把上面的操作临时保存成patch
文件,存在.git/rebase
目录下;
然后,把feature
分支更新到最新的master
分支;
最后,把上面保存的patch
文件应用到feature
分支上;从
commit
记录我们可以看出来,feature
分支是基于hotfix
合并后的master
,自然而然的成为了最领先的分支,而且没有merge
的commit
记录,是不是感觉很舒服了。在
rebase
的过程中,也许会出现冲突conflict
。在这种情况,git
会停止rebase
并会让你去解决冲突。在解决完冲突后,用git add
命令去更新这些内容Git Bash/Shell 1
git rebase --continue
这样
git
会继续应用余下的patch
补丁文件。在任何时候,我们都可以用
--abort
参数来终止rebase
的行动,并且分支会回到rebase
开始前的状态。Git Bash/Shell 1
git rebase —abort
如何配置多个提交账户?
git config user
假如你在 Github 上有个人项目,而公司项目存放在公司内网 gitlab 上,如何为这两种不同类型的项目配置不一样的提交用户呢?
Git 全局的用户配置文件存放在 ~/.gitconfig 中,我们可以通过以下命令设置全局默认的用户名和邮箱。
1 | git config --global user.name "<Your Name>" |
如果需要为某一个项目配置不同的用户,则可以进入到项目对应的目录下,使用以下命令。它会在项目根目录的 .git/config 文件中保存这些配置信息:
1 | git config user.name "<Another Name>" |
Conditional Includes
在 git 2.13 版本中,增加了 conditional includes 配置,可以创建多个 gitconfig 文件,并针对不同的根目录使用不同的配置文件。例如,以下全局配置文件 ~/.gitconfig 中包含以下用户配置信息,当项目 clone 在 ~/dev/ 目录下时,会自动使用另外一份配置文件:
1 | [user] |
以下是 ~/.gitconfig-dev 文件的配置:
1 | [user] |
注意:强烈建议将 global user 配置为你的 Github ID,避免默认提交中有效用户信息的缺失,导致 Github contributions 不准确。同时,不设置为公司邮箱,可以避免邮箱信息泄露。
参考
https://juejin.im/post/6869519303864123399
http://jartto.wang/2018/12/11/git-rebase/