远程仓库命令
关联远程仓库
- git remote add 远程仓库名 [url]
举例:
- git remote add origin git@github.com:chenj-freedom/learngit.git
如上,origin是远程仓库的名字(注意:是仓库的名字,仓库中含有分支等信息)。
查看远程仓库
- git remote //查看远程仓库
- git remote -v //查看远程仓库,更详细信息
如下图:
fetch说明本地有提取远程仓库的权限,push说明本地有推送代码到远程仓库的权限。
克隆远程仓库
- git clone [url]
举例:
git clone操作会自动为你将远程仓库命名为origin,并抓取远程仓库中的所有数据,建立一个指向它的master指针,在本地命名为orgin/master,然后,git自动建立一个属于你自己的本地master分支,始于origin上master分支相同的位置(master分支的关联,这个也叫做跟踪远程分支),你可以就此开始工作。
原理如下图所示:
跟踪远程分支
从远程分支checkout出来的本地分支,称为:跟踪分支 (tracking branch)。跟踪分支的本质就是使得本地分支名指向远程分支名指向的内容(本质就是设置指针),如上一小节的图,使得本地分支名(master)指向远程分支名(origin/master)指向的节点。设置了跟踪分支之后,使用git push/git pull命令就会自动使得本地分支(local-branch-name)自动push/pull远程分支(remote-branch-name)的内容。
命令格式如下:
- git checkout -b [local-branch-name] [remote-name]/[remote-branch-name] //传统格式
- git checkout --track [remote-name]/[remote-branch-name] //简化格式
第一行的是传统格式,第二行的是简化格式,简化格式中,本地分支名默认和远程分支名相同。
举例:假设远程仓库中现在有一个分支dev11。
用传统格式跟踪分支后,设置本地分支名和远程分支名相同时,用命令git remote show origin命令查看。这时候,git push配置为把本地dev11分支推送到远程dev11分支,本地master分支推送到远程master分支;git pull命令配置为远程dev11分支合并到本地dev11分支,远程master分支合并到本地master分支。
但是假如用传统方式,设置本地分支名和远程分支名不相同时,用命令git remote show origin命令查看。git pull命令还是2个分支(master和dev11)都能拉取并合并到本地对应的分支,但是push命令就只有master分支能推送了。因此:最好是配置本地分支名和远程分支名一样。(所以直接用--track就默认本地分支名和远程分支名一样)
推送内容
- git push [remote-name] [local-branch-name]:[remote-branch-name]
注意:
1、该命令其中local-branch-name或者remote-branch-name是可以二者省略其一。
2、只有在远程服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取(git pull)到本地,合并到自己的项目中,然后才可以再次推送。
举例:git push origin master
这里git自动把master扩展成了refs/heads/master:refs/heads/master,意为“取出我在本地的master分支,推送到远程仓库的master分支中去”。
若想把远程的master分支叫做other分支,可以使用git push origin master:other。
抓取内容
- git fetch [remote-name] //抓取远程仓库的全部内容,但是不会自动合并
- git pull //抓取远程仓库跟踪分支的内容,并自动合并到本地相应的分支
git pull是你在本地的哪个分支使用本命令,它会自动抓取本地这个分支所跟踪的远程分支的内容,然后合并到本地分支上,对其他分支不会抓取内容。
举例1:git fetch origin
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支。
git fetch会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次fetch以来别人提交的更新)。有一点很重要,需要记住,git fetch命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,需要你自己手工合并。如下图所示:
在本地新建一个git_repo文件夹,不通过git clone命令来克隆一个远程库,而是通过git remote add关联远程库,并用git fetch来抓取远程库的所有未抓取过的数据,当抓取下来之后,必须手动合并git merge远程库的内容,才会显示出分支内容,否则,没有手动合并,git fetch是不会自动合并的。
举例2:git pull
实验前提:在github页面上,dev11分支创建一个新文件remote_file.txt,在master分支创建新文件master_remote_file.txt。并且用git checkout -b跟踪远程分支dev11和master了。接下来用git pull命令(注意:是在本地dev11分支上使用git pull命令,所以会抓取dev11分支跟踪的远程分支的内容,并合并到本地dev11分支上。
但是这时候master分支的内容还是没有改变。如下:
删除远程分支
即删除远程仓库中的分支。
- git push [remote-name] :[remote-branch-name]
还记得git push命令吗?git push [remote-name] [local-branch-name]:[remote-branch-name],把本地分支设置为空(冒号之前的内容),就相对于把一个空分支推送到远程仓库中的remote-branch-name分支去了,就相当于删除了远程仓库中的该分支。
举例:
删除远程仓库本地关联
- git remote rm [remote-name]
举例:git remote rm origin
删除远程分支本地关联
删除远程分支关联也即删除本地跟踪分支。
- git branch -d [local-branch-name]
和删除本地分支一样的命令。
分支管理命令
创建、切换、查看分支
假设dev是要创建分支名字。
- git branch //查看分支
- git branch dev //创建分支
- git checkout dev //切换分支
- git checkout -b dev //创建并切换分支
合并分支
假设dev是要创建分支名字。
- git merge --no-ff -m "commit comment" dev //禁用Fast forward模式合并分支
- git merge dev //Fast forward模式合并分支
在Fast forward模式下,当删除分支后,会丢掉分支信息。
删除分支
假设dev是要创建分支名字。
- git branch -d dev
- git branch -D dev //强行删除掉还未合并的分支
bug分支
由于git的分支功能强大,所以修改bug一般也是新建一个bug分支,修改后,合并到你的工作分支(master分支或者dev分支或者其他),再删除bug分支。
假设场景,当你正在dev分支上编码工作,突然接到一个需要紧急修复的bug,你应该会想建立一个bug分支,但是你dev的工作还没有提交(无论是add或者commit),这时候可以使用“存储工作现场”命令,如下:
- git stash //存储工作现场,对working directory来说
然后首先确定要在哪个分支上去解决bug,比如我想要在master分支上解决bug,就先切换到master分支,然后从master分支上创建一个bug分支。(当然你也可以从别的分支上解决bug,比如dev分支上解决bug)。解决bug后合并到工作分支(就是你从哪个分支创建bug分支的那个分支)。
注意:git stash是针对工作区(working directory)来说的,对缓存区无效。所以再切换到bug分支的时候,缓存区的内容要先commit一下,要不然bug解决后,切换回工作分支,缓存区的内容就丢失了,git stash只存储工作区���场的内容。
- git checkout master //先切换到master分支
- git checkout -b bug //创建bug分支,并切换到bug分支上
- ... //解决bug
- git add . //在bug分支上add
- git commit -m "fix bug" //在bug分支上commit
- git checkout master //切换回master分支
- git merge --no-ff bug //在master分支上合并bug分支
- git branch -d bug //删除bug分支
现在bug解决了,要回到原来dev上的工作,可是时间太久了,忘记了。那么可以用一下命令查看工作现场列表。
- git stash list //查看工作现场列表
可以看出来工作现场保存的是dev分支上的现场。所以要先切换回dev分支,在恢复工作现场。如果没有先切换到dev分支,比如在master分支就去恢复工作现场,那么会执行合并dev分支的操作。
恢复工作现场的命令,如下:
- git stash apply //恢复工作现场
- git stash drop //删除工作现场列表中的对应项
或者直接
- git stash pop //恢复工作现场并删除工作现场列表中的对应项