Git命令
Git是一个开源的分布式版本控制系统,用于在软件开发过程中跟踪源代码的变化。
本文参考:
基础指令
在相关文件目录下,右键打开Git,其中Git Bash Here为命令行窗口,Git GUI Here为GUI界面,这里主要是针对命令行窗口。
1 |
|
1 |
|
工作区和暂存区
- 工作区(working directory)是本地电脑看到的一个目录,比如learngit文件夹,或者说是项目文件夹。
- 工作区中有.git隐藏文件夹,为Git的版本库,其中包括最重要的暂存区(stage/index)。Git会自动创建一个分支master,以及指向master的指针HEAD
- add操作是将文件添加到暂存区,commit操作将暂存区的所有内容提交到当前分支(本地仓库),push操作将本地仓库文件推送到远程仓库。
版本回退
1 |
|
git log
命令只能显示当前分支的commit记录,如果版本回退,只能显示回退到的版本及之前的commit记录,这时如果想要查看回退前的较新的版本信息,可以使用git reflog
。
git reflog
可以查看所有分支的所有操作记录,包括分支切换和版本切换的记录,也包括已经被删除的 commit 记录和 reset 的操作
管理修改
Git管理的是修改,而不是文件
使用add命令添加文件后,如果再次修改,此时提交是不包括第二次修改的。也就是说,每次修改之后都要add之后才能将修改提交到仓库。
撤销修改
想要撤销修改的话,要根据不同的情况采取不同的操作:
- 没有git add 时,使用
git checkout--<file>
命令,file修改后没有放到暂存区,使用此命令回到版本库状态;如果是添加到暂存区后再修改,使用此命令可以回退没修改时的状态。总之,checkout操作让文件回到最近一次commit或者add时的状态。 - 已经git add到暂存区,使用
git reset HEAD <file>
,将暂存区的修改撤销,重新放回工作区 - 已经commit到版本库,使用
git reset --hard HEAD^
回退版本,或者使用回退到指定commit id - 已经push到远程仓库,没救了:(
删除文件
使用rm <file>
指令或者其他方法删除文件后,工作区和仓库文件不一致,这时:
- 如果确定是删除文件,则继续下一步操作即可,
git commit -m 'xxx'
指令,提交删除,会删除仓库文件 - 如果是误删,此时仓库还有文件,使用
git checkout--<file>
恢复即可
比较文件差异
git diff [文件名]
- 将工作区的文件和暂存区进行比较
git diff [本地库中历史版本][文件名]
- 将工作区中的文件和本地库历史记录比较
- 不带文件名则比较工作区中所有文件
添加远程库
在github上创建完仓库(repository)之后,在本地配置好之后,使用push指令可以将本地仓库到远程仓库。前提要求是本地仓库是git仓库,即有init初始化处理、commit等操作。此外,还需要Git配置好SSH环境,参考教程。
本地修改首先提交到本地仓库(无需Internet),然后push到远程:
1 |
|
将远程库地址命名为origin,以后推送时使用origin表示远程库地址.
从远程库克隆
SSH方式:
1 |
|
http方式:
1 |
|
http方式的速度比较慢,ssh方式速度比较快
clone
命令的作用效果:
- 完整地把远程库下载到本地
- 创建origin远程地址别名(即默认将远程地址命名为origin,推送时也可以使用origin)
- 初始化本地库
分支管理
创建与分支合并
1 |
|
Git合并、删除、创建分支的速度非常快,鼓励用分支完成任务再合并,这样过程更安全
分支冲突
如果两个分支都修改了同一个文件的相同位置,在分支合并时会产生冲突。
比如,现有文件内容如下:
1 |
|
在bug_fix
分支上对第二行修改,并添加到暂存区,提交到本地库:
1 |
|
在master
分支上也对第二行修改,并添加到暂存区,提交到本地库:
1 |
|
这时,在bug_fix
分支上使用git merge master
命令将master
分支内容合并过来,会产生冲突,提示自动合并失败。并进入merging
状态。
此时需要手动合并文件,进入文件:
1 |
|
其中<<<<<<<HEAD
和=======
之间的内容是当前分支的内容,下方是要合并过来的分支的内容。
根据实际需求,合并文件内容,将git生成的标记内容删除,保存退出。
这时使用git status
查看状态,提示有未合并的路径,如果已解决完冲突并想要合并,使用add
和commit
(注意此时的commit命令不能添加文件名)命令提交,即可完成合并。
分支管理策略
分支合并时,Git优先用Fastforward模式,这种模式下,删除分支后,会丢掉分支信息。
如果强制禁用Fastforward模式,Git会在merge时生成新的commit,并且在分支历史记录可以看到分支信息:
1 |
|
团队开发中,master分支仅用于发布新版本,日常开发在各自的分支上。
2020.10.1起,github默认主分支改名为main,不再是master
bug分支
当在dev分支工作时,需要临时修复master上一个bug,需要创建临时bug分支,修复、合并,删除分支。
如果dev分支的工作未完成,可以使用$ git stash
命令保留现场。
1 |
|
Feature分支
项目中开发新功能/特征,最好用新的分支,每个功能一个feature分支,在上面开发,完成后,合并,最后删除feature分支。
如果feature分支还未合并,就需要删除掉,需要使用-D参数强行删除:
1 |
|
多人协作
- 情景一,团队内部:如果是同一个企业,不同账户,即多个人同时编写一个项目的场景,需要其他人都是协作者,即有push到远程库的权限。举例,创建者建立远程库,其他人使用
clone
复制远程库,修改后提交到本地库,然后需要有协作者权限,才能push到远程库。 - 情景二,跨团队协作:如果希望别的团队可以协助开发项目,但不能直接
push
,则他们需要先fork
项目到自己的远程库,然后clone
到本地进行开发,开发完以后,push
到自己的远程库,再使用pull request
通知项目管理者,管理者审核代码,确认以后进行merge
操作。
fork操作完以后,项目相当于属于自己,可以随意进行push。如果想要推送给原有的远程库,需要使用pull request操作。
拉取操作
git fetch [远程库地址别名][远程分支名]
git merge [远程库地址别名/远程分支名]
git pull
:是git fetch
和git merge
两个操作和合并。
多人协作的工作模式:
用
$ git push origin <branch-name>
推送自己的修改如果推送失败,则因为远程分支比自己的分支更新,需要使用
$ git pull
命令合并,此命令会自动合并,如果pull
请求之后提示no stracking information
,说明本地分支和远程分支的链接关系没有创建,使用以下命令:
1 |
|
如果合并有冲突,则需要解决冲突,然后提交,push
如果没有冲突或者解决掉冲突后,则使用
$ git push origin <branch name>
推送到远程指定分支
命令总结:
1 |
|
Rebase
1 |
|
标签管理
标签(tag)也是版本库的一个快照,是指向某个commit的指针,tag比直接使用commit更方便。因此,可以使用tag作为版本号。
创建标签
1 |
|
标签不会随着push推送到远程仓库,使用以下命令将tag信息push到远程:
1 |
|
操作标签
1 |
|
- 本文作者:Kangshitao
- 本文链接:http://kangshitao.github.io/2020/10/31/git/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!