今天要来介绍一些与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的仓库资料都已经传送进来。
如何解决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,如下图。
当有两个以上分支同时修改同一份资料,并合併,就会产生冲突
,这时在我们修改的同一份资料当中,git就会修改资料的格式并列出问题,此时我们只要到那份资料修改冲突的部分
即可。
此处我们创建了new branch与new branch2 并共同都修改了同一份资料test.txt,而后在切换到master,先将new branch合併,再来合併new branch2,结果产生了conflict,如下图,并git status发现显示,
both modified : test.txt,为了解决这个bug,我们到test.txt去查看,发现git修改资料格式,并列出问题,此时我们将内容进行修改,如下图
修改完后git add完成更动,接着git status再次查看,已发现git已无报错,最后,我们再次合併git merge new branch2,也没跑出conflict,然后git commit,并cat test.txt,也发现,资料已经做修改。
最后当我们要将修改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即可。
如何在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。
接着,我们在local git fetch origin master获取远端server master分支下最新的commit,可发现一个名为FETCH_HEAD的资料,而其资料位于.git下,其内容记录了远端server最新的commit资料(fff7c96)。
另外在.git下我们还能看到名为HEAD的资料,而其内容纪录的就是我们local最新的commit(134ac6a)。
而我们现在所要达到的目的就是,让远端 master branch的最新 commmit 去merge local端的commit。
我们利用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。
而当两个端最后的修改不同,也就是A=>B , A=>C,不同步,我们直接git merge FETCH_HEAD会产生一个新的merge的commit,但此时还是不同步,变成远端落后local,所以我们要利用git push origin master将local的修改push至远端,最后查看git log 也可查看到最新的一个commit(merge),在远端commit也发现多了一个merge的commit,这样可达到同步。