Git Remote branch & merge & fetch

今天要来介绍一些与Github有关的操作,还有branch的一些操作等等。

首先我们在Github,创建一个新的repository,因为我们已在local有创建好仓库,故直接使用 git remote add origin remote repository URL,将我们local的仓库给push进Github,接着 cat .git/config 会发现,已经local已经获取URL等资料,最后在利用 git push origin master 将local所做的更动push至Github即可。而后,我们在Github的repository重整后,即可发现local的仓库资料都已经传送进来。

http://img2.58codes.com/2024/20126182BB7vpRc4KS.png

http://img2.58codes.com/2024/201261822OPHPgSQrh.png

如何解决merge产生的冲突?

git clone (你所要获取github仓库的url) : 可以clone任何为public的github仓库到我们local端。但当我们对clone来的资料做更改,并想将所做的更动更新至原资料,就会被权限要求要输入密码及帐号。

git branch:可查询当前分支, * 为当前分支。

git branch (分支名) :可创建新的分支。

git checkout (分支名) :可切换到指定分支。不同分支的修改并不影响。

git checkout -b (分支名) : 可新增一个branch并命名,且切换到其分支,等于结合git branch + git checkout。

git -branch -m (旧的分支名) (新的分支名) :可重新命名分支。

git diff (分支名) :可以拿当前分支与指定分支进行比较。

git merge (分支名) : 可将指定分支与当前分支合併,并产生新的一次commit。

我们在此处,将new-branch合併至master,如下图。

http://img2.58codes.com/2024/20126182UbCosuubBB.png

当有两个以上分支同时修改同一份资料,并合併,就会产生冲突,这时在我们修改的同一份资料当中,git就会修改资料的格式并列出问题,此时我们只要到那份资料修改冲突的部分即可。

此处我们创建了new branch与new branch2 并共同都修改了同一份资料test.txt,而后在切换到master,先将new branch合併,再来合併new branch2,结果产生了conflict,如下图,并git status发现显示,

http://img2.58codes.com/2024/20126182UCd6tDIyGd.png

both modified : test.txt,为了解决这个bug,我们到test.txt去查看,发现git修改资料格式,并列出问题,此时我们将内容进行修改,如下图

http://img2.58codes.com/2024/20126182qHECmzq8oc.png

修改完后git add完成更动,接着git status再次查看,已发现git已无报错,最后,我们再次合併git merge new branch2,也没跑出conflict,然后git commit,并cat test.txt,也发现,资料已经做修改。

http://img2.58codes.com/2024/20126182PuSfUKhVFk.png

最后当我们要将修改push至github上时,又出现错误,这是因为我github上面创一个repo时,一个READme档在之后产生,但local repository不知道有这个东西,所以出了问题,在这边我们利用git pull origin master:作用是先 git fetch 远端(github)的 branch,然后与local端的 branch 做 merge,产生一个 merge commit 节点,简而言之就是,从远端更新程式码,并将 master 合併至新的分支

所谓的”远端”预设叫做origin,当有多个不同远端server时,就会有不同名子了

最后,我们在将local资料 git push origin master 进我们的github即可。

http://img2.58codes.com/2024/20126182AGbi2WxWTF.png

http://img2.58codes.com/2024/20126182bFAOAykhdx.png

如何在local端与remote端资料保持同步?

而如果我们要在local端进行开发,尽量先与远端server资料保持同步,而分别有两种方法fetch,pull。

方法一 git fetch origin master:可获取远端server master branch最新的version

ex:可能今天跟同事修改同一份资料,但同事手脚较快,先commit,而这时我们的local端的资料还在前一个远端server的版本,故要先做同步再去进行开发。

我们在远端 master branch 创建一个新的资料 fetch-test,并观看commit,可看到最新版本commit为fff7c96。

http://img2.58codes.com/2024/201261822LjODm9XF0.png

接着,我们在local git fetch origin master获取远端server master分支下最新的commit,可发现一个名为FETCH_HEAD的资料,而其资料位于.git下,其内容记录了远端server最新的commit资料(fff7c96)。

http://img2.58codes.com/2024/201261824UpofFFGFR.png

另外在.git下我们还能看到名为HEAD的资料,而其内容纪录的就是我们local最新的commit(134ac6a)。

http://img2.58codes.com/2024/20126182Yv9XTJLW6b.png

而我们现在所要达到的目的就是,让远端 master branch的最新 commmit 去merge local端的commit。

http://img2.58codes.com/2024/20126182zb0haT29ao.png

我们利用git merge FETCH_HEAD来同步资料,会触发Fast-forward,也就是快转机制,就是 Git 知道这个merge的过程,由于local master branch跟远端master branch在领先新的commit前的都是一样的,故在merge的时候会直接修改 master branch的 HEAD 指向位置,直接移动到远端master branch 的 HEAD 也就是FETCH_HEAD

而我们在merge后,ls发现fetch-test已经同步到local,git log也发现最新的commit资料为fff7c96。

http://img2.58codes.com/2024/20126182ygQyTAB4Ky.png

而当两个端最后的修改不同,也就是A=>B , A=>C,不同步,我们直接git merge FETCH_HEAD会产生一个新的merge的commit,但此时还是不同步,变成远端落后local,所以我们要利用git push origin master将local的修改push至远端,最后查看git log 也可查看到最新的一个commit(merge),在远端commit也发现多了一个merge的commit,这样可达到同步。

http://img2.58codes.com/2024/20126182nBc7NzILPy.png


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章