远程仓库(多人协作)
前面说了那么多,好像都是一个人在本地操作,没有涉及到多人协作的情况。这在团队开发中肯定是不可能的啦,因为我们是一个team。那么多人协作的情况涉及哪些操作呢?
本地仓库关联远程仓库
git remote add origin http://192.168.40.138/ai-edu/git-demo.git
或者,推荐使用下面这种,因为前面配置了SSH公钥和私钥
git remote add origin git@gitee.com:jayxiang31/python_learn.git
第一次先拉取远程库中的README.md和.gitignore等文件
git pull --rebase origin master
克隆远程仓库
前面第三章已经搭好了私有的Git仓库管理器GitLab。同时也创建了一个名为git_test的仓库。现在要做的就是将远程仓库克隆下来。克隆的命令是git clone
git clone http://192.168.40.138/ai-edu/git_test.git
其中http://192.168.40.138/ai-edu/git_test.git
是远程仓库的地址。
当然也可以在IDEA上直接通过图形界面操作,还省去了导入项目的过程。其操作步骤是:
1.选中File->New->Project from Version Control->Git
。如下图所示:
2.在URL中填入远程仓库的地址,点击Clone按钮。如下图所示:
需要注意的是默认情况下只会克隆master分支,其他的分支不会被克隆下来。其他的分支需要通过git pull命令拉取,后面会详细介绍。
删除远程Git仓库
git remote rm origin
查看远程分支
通过git remote
命令可以查看远程仓库,origin表示远程主机。
通过git remote -v 命令可以查看远程仓库详细的信息,包括远程仓库的地址。
$ git remote -v origin http://192.168.40.138/ai-edu/git_test.git (fetch) origin http://192.168.40.138/ai-edu/git_test.git (push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
推送分支
现在将远程仓库克隆下来了,那么该如何将当前分支上所有的本地提交推送到远程库呢?答案是通过git push命令,其语法结构是git push <remote branch> <local branch> 其中<remote branch>表示远程分支名,<local branch>表示本地分支名。
git push origin master
该语句表示将本地的master分支推送到远程的origin分支上。
该语句表示将本地的master分支推送到远程的origin分支上。在实际应用中会在git push命令后面加上-u参数,就像git push -u origin master这样。这是因为如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push。那么哪些分支该与远程分支保持一致呢?一般认为:
1.master 分支是主分支,需要时时与远程同步
2.dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
3.bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
4.feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
说白了就是需要团队协作的分支一定要推送到远程库,否则则不需要。
创建远程分支
通过git push
命令还能创建远程分支。
git push origin dev
假设你本地已经有了dev分支。通过上面的命令可以将dev分支推送到远程库,并创建远程的dev分支。
拉取分支
通过git pull命令可以拉取远程仓库的数据和分支信息。假设如下这个场景:你同事在他本地创建了一个dev分支,并提交到了远程库。同时你也在本地创建了一个dev库,当你push时会推送失败。结果如下图所示:
因为你同事的最新提交和你试图推送的的提交有冲突。解决的办法就是根据Git的提示,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突后,在推送。
$ git pull There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> dev
git pull也失败了。原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
关联本地分支和远程分支
$ git branch --set-upstream-to=origin/dev dev
关联好本地分支和远程分支之后,在pull就能成功了。这回git pull
成功,但是合并有冲突,需要手动解决,解决的方式也是在本地手动处理冲突文件,解决后,提交,在push。
拉取远程分支并创建本地分支
git checkout -b 本地分支名x origin/远程分支名x
该命令会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
例如:
git checkout -b dev origin/dev
删除远程分支
通过
git push origin :dev
命令可以删除远程dev分支。但是这时候本地的dev分支还是存在的。所以还需要通过git branch -d dev
删除本地的dev分支。
查看分支
通过git branch
可以查看本地分支
通过git branch -a
可以查看本地分支和远程分支。
版本回退
在实际开发中我们经常会碰到这样一个场景,比如:你误提交了一段有问题的代码,导致其他同事更新代码之后项目启动不了,这时候该怎么办呢?我们首先想到的就是将版本回退。回退到之前那个没有问题的版本。
通过git log 命令找到当前的仓库所有的提交日志。然后,找到你需要回退到的版本。如下图所示:
回退到上一个版本:git reset HEAD
回退到指定版本:git reset commitId 其中commitId是指定版本的版本号,比如这里将版本信息回退到b50c9bdcbf9641d33e4b531bd96dc1f27d4bf602 这个版本。那么命令就是:
git reset b50c9bdcbf9641d33e4b531bd96dc1f27d4bf602
回退之后,再次通过git log
查看,则最新的提交日志已经变成了hello 提交
这个版本了。
当然,通过IDEA来回退则更加的简单。直接在Version Control->Log
在待回退到的版本上右键,选中Reset Current Branch to Here
即可。
其实回退操作的本质,就是将HEAD指针的指向要回退的那个版本上。
将多次提交合并成一次提交
在实际开发中我们经常需要进行代码Review。如果同一个功能点分了很多次提交话,那么在进行代码Review时则会非常的不方便。这时候就需要将多次提交合并成一次提交。具体的步骤是:
1.通过git switch <branchname>命令切换到需要合并提交的代码的分支,比如:git switch test
2.查看需要合并的提交,如下有三次提交需要合并
3.通过rebase命令修改提交指令,这里git rebase -i HEAD~3
表示查看最近的三次提交命令,合并几次则需要将对应的数字改成几。
git rebase -i HEAD~3
执行该命令之后会打开提交指令的日志文件,这里只保留第一次的提交,将另外的两次提交改成 s
保存之后会进入另外一个文件,该文件无需修改,直接输入:q!
命令退出即可。操作之后我们可以看到之前的三次提交记录变成了一次提交记录。
4. 如何要把这次提交合并到其他分支只需要切换到目标分支,执行如下命令;
git cherry-pick <commitid>
分支重命名
git branch -m oldname newname
8. 标签管理
标签管理比较简单,再此只是简单描述一下。
#创建标签 v1.0 git tag v1.0 #查看标签 git tag #删除标签v1.0 git tag -d v0.1 #*****还可以加上-a参数来创建一个带备注的tag,备注信息由-m指定。如果你未传入-m则创建过程系统会自动为你打开编辑器让你填写备注信息。 git tag -a v1.0 -m "这是第一次发版" #推送标签 git push origin --tags #删除远程标签 git push origin :refs/tags/v1.0
回滚某次提交
回滚本地仓库的某次提交,回滚的命令是
git revert <subcommand>
例如:本次提交的commandId 是311737d3
git revert 311737d3
总结
一万六千多字,我写的累,你们看的也累!!!文中奉上几张美女照片给各位读者大大解解乏。我真真正正的肝了两天了。现在终于肝完了。希望对读者朋友们有所帮助。
看文字实在是太累了。下面就用一张图来做一个总结吧。
这张图清晰的表明了Git的基本流程。