问题驱动的Git学习

(搬运自我在SegmentFault的博客)

本人是个Git新手,平时用Git最多的就是push,因为别的都不怎么会用。这几天因为在小组中负责代码的整合,顺便将代码提交到Github,接触到了Git更多的用法。

第一个问题比较简单,其实是关于Github的问题。就是我平时用Git的机器是自己的电脑,密钥也是存在本机上并把上传到Github上。那么我在机房的机器上难道要复制一份私钥过来?既不优雅也不安全。(网上还真有人这么干。)其实Github这类网站是可以保存多份公钥的,不信自己到Edit Profile->SSH Keys去看看。这是也明白为什么Git的Windows GUI版为什么不用设置密钥了。顺便记一下生成密钥的过程备忘。

cd ~/.ssh
ssh-keygen -t rsa -C "YOUR_EMAIL@YOUREMAIL.COM"

此时~/.ssh/id_rsa.pub就是你的公钥。

第二个问题稍微复杂一点,是关于在多台机器提交代码导致的问题。因为我会在我自己的电脑和机房电脑修改代码,难免造成代码的不一致。这时如果push代码可能会出错,原因可能是本地代码在版本树中的位置更早,或者多处独立提交了代码导致冲突。通常此时应当先将代码拉取下来解决冲突。

git fetch origin

执行完这一句后,我们会把执行git branch -r看到的远程分支都fetch下来。下面执行merge。

git merge origin/a-branch

这样会将远程repo中名叫a-branch的分支合并到本地的当前分支,默认就是master。关于分支的问题会在第三个问题再说。
如果merge之后自动解决了冲突最好,没有的话就略麻烦。Git会将所有有冲突的文件显示在终端里。如下图所示。
merge

我们打开有冲突的文件,会看到类似下面这样的标识。
conflict

其中横线前的部分表示本地分支的内容,横线后则表示origin/master中的内容。
根据Git的提示,我们需要手动消除冲突。而不管我们改成什么样,Git并不关心,哪怕我们什么也不改也可以。注意此时我们用git status查看发现,冲突的文件被标记为了unmerged paths.
手动消除冲突后,我们就可以将这些文件加到暂存区。之后就可以随意commit和push了。
不过也有时候,Git会自动进行Fast Forward Merge
fast forward merge

如果merge的结果不是我们想要的怎么办?

git reset --hard

那么,如果我们本地的分支是领先于远程分支,那么merge会怎么样?请看图。
already up-to-date

至于merge和rebase的区别,stackoverflow上已经说的很好了。假设这是目前的状态:

      C---D---E local
     /
A---B---F---G remote

merge之后是这样:

      C---D---E local
     /         
A---B---F---G---H remote

而rebase之后是这样:

              C'--D'--E' local
             /
A---B---F---G remote

当然,他们的效果自然是一样的。

下面就是第三个问题了,关于Git中的分支。对于Git中的这一功能,之前一直没有去仔细研究,直到今天我们组就项目的某一实现产生了分歧,组长让我创建一个分支进行试验。假定我在本地创建出一个名叫test的分支:

git branch test

切换到test分支:

git checkout test

删除test分支:

git branch -d test

使用分支的一个好处自然就是代码可能在多个方向同时进行而不会相互干扰。当你切换到一个分支时,代码就会自动更换成对应分支的内容。而这一切都可以交给Git,而不需要自己手工备份代码。

原文地址:https://www.cnblogs.com/CodeCabin/p/3961498.html