1 git基本概念梳理
1.1 git的工作目录、暂存区和HEAD指向的版本库以及branch的概念
一个branch就是整个产品的一套代码,而工作目录中就是存放的本branch最新的代码,HEAD指向的branch是最近一次提交后的整个产品的一套代码。从branch的角度就能够很好的把工作目录和HEAD指向的版本库联系起来了。工作目录中的一套代码存放在外存的一个位置,版本库的代码存放在另外一个位置。暂存区中只是存放git add的几个文件而已。
另外,版本库和远程的版本库是一样的,但是,本地的版本库如果没有更新的话,一些分支的会落后远程库一些commit。
要想本地的版本库和远程的版本库的代码一致,那么就git fetch <remote>就行,不用指定主机名,因为clone本地库的时候,就已经把本地和远程主机关联起来了。git已经记住了。
2 各个命令不要单独用,而是加上branch已经主机名,这样的话,不会记混
也就是说,记住其操作的对象。
2.1 命令操作的对象
2.1.1 远程主机
只在git clone时会用到。
2.1.2 远程主机上的仓库和远程主机上的仓库中的分支
使用git branch -r就可以查看到远程主机上的仓库和分支,返回的是一个<remote>/<branch>列表,前面就是远程仓库名,后面是各个branch名。
所有,git操作的基本单位是branch,但是为了把远程和本地的branch区分开,就用了一个远程仓库名。
3 不要用git pull,用git fetch
git fetch <remote>将远程的所有分支的代码拉取到本地,它不会merge,本地仓库就和远程仓库同步了,然后就可以进行branch的merge了。
4 本地的分支和远程跟踪分支发生了分歧的解决办法,最简单的方式
第一,保存好本地修改的未提交的代码
第二,同步本地版本库到远程版本库
git fetch <remote>
第三,重新定义本分支的commit链表
git reset <remote>/<branch>
这样的话,HEAD指针就指向了远程分支的最新一次提交,那么该branch就和远程的branch一样了。
但是,现在工作区和缓冲区还没有变化,
工作区是当前branch的最新代码,如果加了--hard的话,那么,工作区的代码会被更新到该branch最新的状态的所有代码。
而缓冲区就会被清掉,因为,工作区和当前分支的版本库是一样的,那么它就什么也没有了。
如果使用--soft,当前工作区和缓冲区都不变。那么当前工作区的代码就会和当前分支版本库中的代码区别比较大了,因为很可能很多人已经向远程分支提交了commits。这个时候怎么办呢?因为很多当前分支库的代码工作区都没有,难道这次提交之后,工作区没有的这些代码就会被删除吗?是的,如果很多提交的话,都会没有了。
--soft的使用时机?适合于变更集合比较小,也就是说,本地进行了一次提交,但是还没有push到远程分支,这个时候,可以git reset --soft HEAD^,这样的话,就会把本次提交丢弃,但是工作目录中还存在本地修改,然后再提交就可以了。也就是说,git的这些命令都是有自己的适用范围的。
因此,如果远程分支已经有别人提交了,那么用git reset --hard <remote>/<branch>,那么本地分支和远程分支又同步了,然后工作目录和缓存目录也都干净了。
第四,再把修改的文件加进来
改好后,重新提交即可。
5 怎样避免发生diverge
在多个人同时在一个分支上开发时,很容易发生diverge的情况。为什么会发生diverge呢?主要的原因是因为没有同步服务器端最新的代码。服务器端已经有新的commit了,但是,自己并没有同步,就commit,这样的话,自己和远程分支就会diverge。
那么怎样避免呢?做到两点就可以避免,第一,commit前必须要先同步到远程最新的代码,同步的时候就算conflict也没有关系,只要解决冲突就可以了。第二,commit之后尽快push到服务器端。这样可以尽量减少diverge的可能性。当不可避免的发生了diverge这么办呢?4是一种很保守的做法。更好的办法
第一种思路,git fetch origin/master然后git merge origin/master
第二种思路,git fetch origin/master然后git rebase