Git命令速查表
我最喜欢的图
[图片上传失败...(image-9990b6-1510206626730)]
版本控制系统
集中式:(SVN,CVS)
- 工作前都需要把最新代码从中央库 Pull 下来。工作完成然后再 Push 到中央库中,意味着必须联网。受网络限制,并且不安全
分布式:(Git,BitKeeper)
- 每一台终端都是一个中央服务器。代码保存在本地,十分灵活。
时光穿梭
工作区和暂存区
命令组 | 意义 |
---|---|
git add file | 文件添加到暂存区 |
git commit -m "提交说明" |
-m 后面输入的是本次提交的说明 |
git status | 查看当前仓库的状态 |
git diff | 查看修改内容 |
管理修改
命令组 | 意义 |
---|---|
git log (--pretty=oneline) | 当前文件所有历史版本 |
cat file | 查看文件内容 |
git reflog | 查看每一次提交的id |
git reset --hard [版本号] | 回到某一版本。HEAD 就是当前版本 |
撤销修改
命令组 | 意义 |
---|---|
git checkout -- file | 丢弃工作区修改。回到最近一次git commit 或git add 时的状态 |
git reset HEAD file | 把暂存区的修改撤销掉 |
删除文件
命令组 | 意义 |
---|---|
git rm file | 删除文件。删除后可以借助git checkout 恢复文件到版本库中存在的文件的最新版本 |
远程仓库
添加远程仓库
命令组 | 意义 |
---|---|
git remote add origin [url] | 关联一个远程库 |
git push -u origin master | 第一次推送本地master 分支的内容到远程,添加-u 参数完成初始化 |
git push -u -f origin master | 遇到报错时可以选择覆盖远程master ,强制提交 |
git push origin master | 第一次之后每次推送最新修改。推送master 分支内容到远程master 分支 |
从远程仓库克隆
命令组 | 意义 |
---|---|
git clone [url] |
https 协议克隆一个仓库。速度慢 |
git clone git@github.com:[用户名]/[仓库名].git |
ssh 支持的原生git 协议。克隆一个仓库 |
提交代码到远程仓库
命令组 | 意义 |
---|---|
git pull origin master | 下载远程仓库的最新内容 |
git push origin master | 上传到分支 |
分支管理
创建与合并分支
命令组 | 意义 |
---|---|
git checkout -b [分支名称] | 创建加切换到分支 |
git branch [分支名称] | 创建分支 |
git checkout [分支名称] | 切换到分支 |
git branch | 查看分支 |
git merge [分支名称] | 合并指定分支到当前分支 |
git branch -d [分支名称] | 删除指定分支(确保当前不在此分支上) |
解决冲突
双方修改同一文件的不同地方不会触发。相反修改同一文件的同一地方才会触发。各自修改提交后,合并时就会出现冲突。我们切换到主分支下,对文件进行最终修改后。再进行提交即可
CONFLICT (content): Merge conflict in [文件名称]
Automatic merge failed; fix conflicts and then commit the result.
命令组 | 意义 |
---|---|
git log --graph | 可以看到分支合并图 |
分支管理策略
命令组 | 意义 |
---|---|
git merge --no-ff -m "描述" [分支名称] | 合并分支时,强制禁用Fast forward 模式。此时Git就会在merge 时生成一个新的commit 。所以需要加上-m 参数 |
- 加上
--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而Fast Forward
合并看不出来曾经做过合并。
分支策略: master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本。你和你的团队每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。所以团队合作看起来就像这样:
[图片上传失败...(image-1fdec4-1510206626730)]
Bug 分支
当某一天你在工作时,你的Boss告诉你你之前的代码出现了bug。需要你在一个小时内改完,可是你当前在dev上进行的工作暂时还没有完成没办法提交。预计还有很久的时间,可又必须在一个小时内改完bug。该怎么办:
命令组 | 意义 |
---|---|
git stash | 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作 |
git stash apply [stash@{0}] | 恢复指定的工作现场。stash 内容并不删除 |
git stash drop [stash@{0}] | 删除指定 stash
|
git stash pop | 恢复到前一工作现场。并删除该stash
|
注意:
首先确定要在哪个分支上修复 bug,假定需要在master
分支上修复,就从master
创建临时分支issue-101
。修复完成后,再切换回master
分支进行合并。最后删除issue-101
分支。在不同分支上进行修复,工作区中看到的代码不一定是相同的,需要确保这一点。并且在不同分支上进行修复后,最后会合并到该分支上。如果代码要最终发布,你需要再将你分之上的代码merge
到master
分支上。
多人协作
注意:
合作开发新功能时,最好在一个新的分支上进行新功能的开发,而不去污染主分支。当该功能开发好之后再去合并到主分支即可。
命令组 | 意义 |
---|---|
git remote -v | 查看远程库的详细信息。( fetch,push 抓取和推送的origin 的地址 ) |
git push origin [分支名称] | 推送该分支的本地内容到远程库的分支上。 |
注意:
这里还有一个学问就是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
-
master
分支是主分支,因此要时刻与远程同步 -
dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步- 多人协作时,大家都会往
master
和dev
分支上推送各自的修改。
- 多人协作时,大家都会往
-
bug
分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug -
feature
分支是否推到远程,取决于你是否和你的同班合作在上面开发
命令组 | 意义 |
---|---|
git checkout -b branch-name origin/branch-name | 在本地创建和远程分支对应的分支 |
git branch --set-upstream branch-name origin/branch-name | 建立本地分支和远程分支的关联 |
git push origin branch-name | 本地新建的分支如果不推送到远程,对其他人就是不可见的, 从本地推送分支到远程(会让你输github的用户名和密码)。 |
多人协作的工作模式通常是这样:
- 首先从远程库clone下项目,然后在本地创建远程
origin
的dev
分支到本地。然后就可以在dev
分支上提交修改 - 然后可以试图用
git push origin branch-name
推送自己的修改 - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
拉取下来最新的提交,如果拉取失败则是因为远程的分支与本地的分支没有建立链接。设置好后再git pull
进行合并 - 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功
错误:
fatal: Cannot update paths and switch to branch 'dev' at the same time.
Did you intend to checkout 'origin/dev' which can not be resolved as commit?
解决:
git remote show origin
git remote update
git fetch
git checkout -b local-name origin/remote-name
对应多个远程库 (码云,GitHub)
命令集 | 意义 |
---|---|
git remote -v | 查看远程库信息 |
git remote rm [远程库名] | 删除已关联的远程库 |
git remote add [远程库别名] git@github.com:[username]/[repo].git | 关联GitHub的远程库,可以给远程库起个别名,这样可以一个本地库关联多个远程库而不会出现名称冲突的问题 |
git push [远程库名称] master | 将master分支代码推送到名称对应的远程库上 |
[图片上传失败...(image-61f549-1510206626730)]
最后
送上一本书据说很牛逼的关于Git的书,我看了两眼觉得牛逼,但实在没空看完它有空会去看的。点击这里
推荐:
Acey:Git指南 - 3个小时搞定git
stormzhang:从0开始学习 GitHub 系列之「Git 进阶」
网友评论