本篇文章給大家?guī)黻P(guān)于git的相關(guān)知識,其中主要介紹了關(guān)于遠(yuǎn)程倉庫的相關(guān)內(nèi)容,git并不像svn那樣有個(gè)中心服務(wù)器,下面看一下使用了github作為遠(yuǎn)程倉庫的一些問題,希望對大家有幫助。
推薦學(xué)習(xí):《git》
Git 遠(yuǎn)程倉庫(github)
Git 并不像 SVN 那樣有個(gè)中心服務(wù)器。
目前我們使用到的 Git 命令都是在本地執(zhí)行,如果你想通過 Git 分享你的代碼或者與其他開發(fā)人員合作。 你就需要將數(shù)據(jù)放到一臺其他開發(fā)人員能夠連接的服務(wù)器上。
本例使用了 Github 作為遠(yuǎn)程倉庫,你可以先閱讀我們的 Github 簡明教程。
遠(yuǎn)程倉庫命令
1、 查看當(dāng)前的遠(yuǎn)程庫
2、添加遠(yuǎn)程倉庫
運(yùn)行 git remote add 添加一個(gè)新的遠(yuǎn)程 Git 倉庫, 同時(shí)指定一個(gè)方便使用的簡寫:
3、$ git fetch
這個(gè)命令會訪問遠(yuǎn)程倉庫,從中拉取所有你還沒有的數(shù)據(jù)。 執(zhí)行完成后,你將會擁有那個(gè)遠(yuǎn)程倉庫中所有分支的引用,可以隨時(shí)合并或查看。
origin下所有分支都被復(fù)制
git fetch 命令只會將數(shù)據(jù)下載到你的本地倉庫——它并不會自動合并或修改你當(dāng)前的工作。 當(dāng)準(zhǔn)備好時(shí)你必須手動將其合并入你的工作。
git pull 命令來自動抓取后合并該遠(yuǎn)程分支到當(dāng)前分支
默認(rèn)情況下,git clone 命令會自動設(shè)置本地 master 分支跟蹤克隆的遠(yuǎn)程倉庫的 master 分支(或其它名字的默認(rèn)分支)。 運(yùn)行 git pull 通常會從最初克隆的服務(wù)器上抓取數(shù)據(jù)并自動嘗試合并到當(dāng)前所在的分支。
3、git push 推送到遠(yuǎn)程倉庫
只有當(dāng)你有所克隆服務(wù)器的寫入權(quán)限,并且之前沒有人推送過時(shí),這條命令才能生效。 當(dāng)你和其他人在同一時(shí)間克隆,他們先推送到上游然后你再推送到上游,你的推送就會毫無疑問地被拒絕。 你必須先抓取他們的工作并將其合并進(jìn)你的工作后才能推送。
4、查看某個(gè)遠(yuǎn)程倉庫
如果想要查看某一個(gè)遠(yuǎn)程倉庫的更多信息,可以使用 git remote show 命令。
5、遠(yuǎn)程倉庫的重命名
git remote rename 來修改一個(gè)遠(yuǎn)程倉庫的簡寫名
6、遠(yuǎn)程倉庫的移除
git remote remove 或 git remote rm
7、打標(biāo)簽:可以給倉庫歷史中的某一個(gè)提交打上標(biāo)簽,以示重要。 比較有代表性的是人們會使用這個(gè)功能來標(biāo)記發(fā)布結(jié)點(diǎn)
1)列出標(biāo)簽
2)git tag -l/list 通配符方式列出標(biāo)簽
3)輕量標(biāo)簽(lightweight):它只是某個(gè)特定提交的引用,本質(zhì)上將提交校驗(yàn)和存儲到一個(gè)文件中——沒有保存任何其他信息
4)附注標(biāo)簽(annotated):存儲在 Git 數(shù)據(jù)庫中的一個(gè)完整對象, 它們是可以被校驗(yàn)的,其中包含打標(biāo)簽者的名字、電子郵件地址、日期時(shí)間, 此外還有一個(gè)標(biāo)簽信息
5)后期打標(biāo)簽:針對歷史項(xiàng)目打標(biāo)簽
6)共享標(biāo)簽:git push 命令并不會傳送標(biāo)簽到遠(yuǎn)程倉庫服務(wù)器上,可以運(yùn)行 git push origin 。
git push origin --tags:將會把所有不在遠(yuǎn)程倉庫服務(wù)器上的標(biāo)簽全部傳送到那里。 
7)要刪除掉你本地倉庫上的標(biāo)簽
git tag -d
注意上述命令并不會從任何遠(yuǎn)程倉庫中移除這個(gè)標(biāo)簽,你必須用 git push :refs/tags/ 來更新你的遠(yuǎn)程倉庫:
注意上述命令并不會從任何遠(yuǎn)程倉庫中移除這個(gè)標(biāo)簽
必須用第一種變體是 git push :refs/tags/ :
$ git push origin :refs/tags/v1.4-lw
上面這種操作的含義是,將冒號前面的空值推送到遠(yuǎn)程標(biāo)簽名,從而高效地刪除它。
第二種更直觀的刪除遠(yuǎn)程標(biāo)簽的方式是:
$ git push origin –delete
8、git分支管理
注:git branch ,列出當(dāng)前所有分支,分支前的 * 字符:它代表現(xiàn)在檢出的那一個(gè)分支
1)git branch testing 創(chuàng)建testing分支
2) git checkout testing 切換分支, 查看當(dāng)前分支,可以 HEAD 指向即為當(dāng)前所在的分支
【 git checkout -b 創(chuàng)建并切換分支】
3)輿情測試+testing分支分別提交,head指針會向前移動
兩分支的基準(zhǔn)都是9623a70fe,分別提交后各自的指針改變
運(yùn)行 git log –oneline –decorate –graph –all ,它會輸出你的提交歷史、各個(gè)分支的指向以及項(xiàng)目的分支分叉情況。
分叉情況:
分支合并 git merge【輿情分支不做修改,hotfix分支產(chǎn)生新提交情況】–三方合并
hotfix基于輿情測試分支拉取,于hotfix產(chǎn)生提交,查看hotfix分支的提交id為85bb*,切換回輿情分支,執(zhí)行g(shù)it merge,發(fā)現(xiàn)輿情分支的提交id也推進(jìn)到hotfix分支產(chǎn)生的85bb*
輿情分支及hotfix分支變化圖解:
分支合并 git merge【輿情分支/Testing分支都產(chǎn)生新提交情況】
Test基于輿情測試分支拉取,Test分支/輿情分支分別修改產(chǎn)生提交,在輿情分支合并hotfix分支內(nèi)容后,切換至Test分支, test分支合并輿情分支時(shí),發(fā)現(xiàn)Testing分支直接產(chǎn)生新的提交id41b1*,而輿情分支中的對應(yīng)的對應(yīng)的d804和85不會id不會合并過來,此刻新id對應(yīng)兩個(gè)父級id,分別是testing的Da4和輿情分支的85b
1)git checkbox Testing
2)git merge 輿情分支
4)git branch -v 查看每個(gè)分支的最后一次提交
5)git branch –merged/–no-merged 過濾這個(gè)列表中已經(jīng)合并或尚未合并到當(dāng)前分支的分支
6)git branch -d
包含了還未合并的工作,嘗試使用 git branch -d 命令刪除它時(shí)會失敗,除非用-D
9、遠(yuǎn)程分支
1) git ls-remote 來顯式地獲得遠(yuǎn)程引用的完整列表
通過 git remote show 獲得遠(yuǎn)程分支的更多信息
2)origin/master和master區(qū)別
master : 它代表本地的某個(gè)分支名。 origin master 代表著兩個(gè)概念,前面的 origin 代表遠(yuǎn)程名,后面的 master 代表遠(yuǎn)程分支名 origin/master 本地分支,是從遠(yuǎn)程拉取后,在本地建立的一份拷貝【是用來和遠(yuǎn)程分支對應(yīng)的,一般不可見】 舉幾個(gè)例子可能會更加清晰地說明問題: ① 執(zhí)行 git fetch origin master 時(shí),它的意思是從名為 origin 的遠(yuǎn)程上拉取名為 master 的分支到本地分支 origin/master 中。既然是拉取代碼,當(dāng)然需要同時(shí)指定遠(yuǎn)程名與分支名,所以分開寫。 ②執(zhí)行 git merge origin/master 時(shí),它的意思是合并名為 origin/master的分支到當(dāng)前所在分支。既然是分支的合并,當(dāng)然就與遠(yuǎn)程名沒有直接的關(guān)系,所以沒有出現(xiàn)遠(yuǎn)程名。需要指定的是被合并的分支。 ③執(zhí)行 git push origin master 時(shí), 推送本地的 master 分支到遠(yuǎn)程origin, ④ 一次性拉取多個(gè)分支的代碼:git fetch origin master dev1 dev2 ⑤ 一次性合并多個(gè)分支的代碼:git merge origin/master 分支1 分支2 分支3
2)如果遠(yuǎn)程倉庫有人提交內(nèi)容,那么遠(yuǎn)程倉庫就會向前移動,而本地origin/master如果不拉取,將還保持不動,如果希望本地同遠(yuǎn)程保持一致,可以通過git fetch拉取遠(yuǎn)程倉庫數(shù)據(jù),
git fetch
3) git push origin 分支名
推送本地的 輿情測試 分支,將其作為遠(yuǎn)程倉庫的 輿情測試 分支
如果并不想讓遠(yuǎn)程倉庫 上的分支叫做 輿情測試 ,可以運(yùn)行 git push origin 輿情測試 :test0421 來將本地的 輿情測試 分支推送到遠(yuǎn)程倉庫上的 test0421 分支。
4)checkout 的操作
通過 git checkout test0421 會把分支切換到test0421分支上
這個(gè)操作會處于‘detached Head’ 狀態(tài),在這種狀態(tài)下不會修改origin/test0421上的數(shù)據(jù),可以修改并提交做一些實(shí)驗(yàn)性的操作,但是切換回test0421分支后,再次從test0421切換回origin/test0421時(shí),之前的改變不會同步,因?yàn)閛rigin/test0421 是用戶只讀的
5)git push origin –delete 分支名 刪除遠(yuǎn)程倉庫分支【本地倉庫還有數(shù)據(jù)】
6)rebase變基:使用 rebase 命令將提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一樣。
首先找到這兩個(gè)分支(即當(dāng)前分支 Test0421、變基操作的目標(biāo)基底分支 Test0420) 的最近共同祖先 85bb,然后對比當(dāng)前分支相對于該祖先的歷次提交,提取相應(yīng)的修改并存為臨時(shí)文件, 然后將當(dāng)前分支指向目標(biāo)基底 3467, 最后以此將之前另存為臨時(shí)文件的修改依序應(yīng)用
Test0420 使用git merge 合并Test0421內(nèi)容,結(jié)果兩個(gè)分支完全一致,可以發(fā)現(xiàn)提交記錄沒有出現(xiàn)分拆,而是保持在一條直線上【可以比較前面get merge環(huán)節(jié)中結(jié)果出現(xiàn)分叉】
rebase時(shí)一系列提交按照原有次序依次應(yīng)用,只是當(dāng)前分支的提交id值改變
merge時(shí)多次提交合并成一次,生成新的提交id
總結(jié):無論是通過變基,還是通過三方合并,整合的最終結(jié)果所指向的快照始終是一樣的,只不過提交歷史不同罷了。 變基是將一系列提交按照原有次序依次應(yīng)用到另一分支上,而合并是把最終結(jié)果合在一起。
推薦學(xué)習(xí):《git》