上篇文章把平常最最最經(jīng)常用到的一些命令,但是基本是常規(guī)情況下瓷患,接下來(lái)講講不太正常情況下的命令骡尽。
首先,我們?cè)诒镜刈钪苯咏佑|的是遠(yuǎn)程自己倉(cāng)庫(kù)擅编,至于遠(yuǎn)程別人的倉(cāng)庫(kù)(大家共同修改文件的倉(cāng)庫(kù),后文簡(jiǎn)稱遠(yuǎn)程倉(cāng)庫(kù))主要是通過(guò)遠(yuǎn)程自己的倉(cāng)庫(kù)進(jìn)行mr箫踩。
那么我們?nèi)绾伪WC自己的倉(cāng)庫(kù)里面有別人的修改呢
pull
可以看到遠(yuǎn)程倉(cāng)庫(kù)里面有個(gè)others.txt文件爱态,而本地是沒(méi)有的,為了能讓本地和遠(yuǎn)程倉(cāng)庫(kù)同步境钟,就需要用到pull
和push是對(duì)應(yīng)的锦担,一般后面也會(huì)跟著遠(yuǎn)程倉(cāng)庫(kù)的地址(上一篇文章中簡(jiǎn)單地說(shuō)了下如何設(shè)置不同的遠(yuǎn)程倉(cāng)庫(kù)的地址)
mr時(shí)conficts
可以發(fā)現(xiàn)本地也已經(jīng)有了新增的文件。注意慨削,我們修改的文件也是在遠(yuǎn)程倉(cāng)庫(kù)中的洞渔,那如果別人覺(jué)得我們的文件寫(xiě)得不夠好然后修改了套媚。
就比如上次提交的helloworld,覺(jué)得不行磁椒,太簡(jiǎn)單了堤瘤,只打印了一次,然后加了個(gè)for循環(huán)打印了100次浆熔,并且在每次打印后面加上序號(hào)本辐。
于此同時(shí),我們也覺(jué)得代碼也得不夠好医增,需要重復(fù)執(zhí)行1000遍慎皱,并且想在輸出完后再來(lái)一句經(jīng)典臺(tái)詞,于是乎我們改了本地的代碼叶骨。
接著心高彩烈地push了代碼茫多,并且提起了Merge Request,也有的平臺(tái)稱為Pull Request忽刽,這時(shí)候就會(huì)發(fā)現(xiàn)
有告警此Pull Request無(wú)法自動(dòng)合并地梨,你應(yīng)該手動(dòng)合并它
,其實(shí)就是你和其他人同時(shí)修改了文件中的統(tǒng)一行缔恳,沖突了宝剖。之后就得是解決沖突,不同平臺(tái)的解決沖突的界面應(yīng)該不同歉甚,但是本質(zhì)都是git万细。
此時(shí)就需要到程序員之間討(撕)論(b),究竟是以誰(shuí)的為準(zhǔn)纸泄,這里假設(shè)這種赖钞,保持后面的i + 1
但是需要循環(huán)1000次。所以就需要修改為
其實(shí)這個(gè)文件的代碼原則上你刪了都沒(méi)關(guān)系聘裁,因?yàn)間it已經(jīng)跟你說(shuō)這個(gè)文件有沖突了雪营,至于如何選擇,需要保留什么衡便,git覺(jué)得我們會(huì)處理好的献起。當(dāng)完成這一切之后就和之前的mr是一致的,審核通過(guò)就可以合入了
但是在mr的時(shí)候再去解決沖突镣陕,總感覺(jué)有點(diǎn)麻煩谴餐,所以一般工作中常用的做法就是在commit之后,先pull一下最新代碼
pull時(shí)conflicts
可以看到遠(yuǎn)程的倉(cāng)庫(kù)此時(shí)是這樣滴
然后遠(yuǎn)程對(duì)文件進(jìn)行了修改呆抑,模擬其他同事合入了新代碼
同樣在不知道的情況下岂嗓,我們想要添加一個(gè)getStr的方法,并且在main函數(shù)里面調(diào)用
編輯完后正常add鹊碍,commit厌殉,但是不要push食绿,先pull一下遠(yuǎn)程倉(cāng)庫(kù)的代碼
在最后可以看到一個(gè)這樣的信息,就是讓我們解決沖突
Auto-merging hello.java
CONFLICT (content): Merge conflict in hello.java
Automatic merge failed; fix conflicts and then commit the result.
如何解決呢公罕,就是編輯沖突的文件即可器紧,用vim來(lái)看下沖突的文件此時(shí)長(zhǎng)啥樣
只需要把<<<<<<<
,=======
和>>>>>>>
還有HEAD這些非我們想要的字符刪掉熏兄,然后保留需要的代碼品洛,最后就正常add commit push mr即可。
這時(shí)候肯定會(huì)有剛學(xué)的小伙伴就問(wèn)了摩桶,那如果改的期間別的人又往倉(cāng)庫(kù)中合入了代碼咋辦呢
開(kāi)玩笑開(kāi)玩笑桥状,但是這種情況99.99%只會(huì)存在在理論中,現(xiàn)實(shí)工作中基本不會(huì)出現(xiàn)硝清,如果恰巧碰到了那就再解決沖突唄辅斟。
stash
- 我們修改了多個(gè)文件比如修改了ABCDEF...Z這26個(gè)文件
- 主管就過(guò)來(lái)說(shuō)有個(gè)模塊非常急,需要先合入ABCD這4個(gè)文件
- 遠(yuǎn)程倉(cāng)庫(kù)已經(jīng)有人合入了LX這兩個(gè)文件
- 然后記得養(yǎng)成良好的習(xí)慣芦拿,commit后pull一下遠(yuǎn)程代碼庫(kù)
總結(jié)就是不想提交所有修改的文件士飒,且修改的文件中有沖突的情況下
意思就是,本地有些文件可能在合入的時(shí)候被覆寫(xiě)蔗崎,此時(shí)有兩種選擇
- commit酵幕,然后解決沖突
- stash,然后pull下來(lái)缓苛,之后stash pop的時(shí)候如果有沖突芳撒,解決沖突
stash就是把本地的所修改的先放在一個(gè)git的“堆棧”中未桥,本地對(duì)遠(yuǎn)程就是未修改的狀態(tài)笔刹,然后就能正常的pull
使用git stash save [save message]
來(lái)暫存改變之后,能夠成功的pull下來(lái)冬耿,接下來(lái)看下git的狀態(tài)
既然能保存舌菜,那肯定能取出來(lái),上面也說(shuō)過(guò)亦镶,如果你save的文件和遠(yuǎn)程倉(cāng)庫(kù)修改的文件一樣日月,那么pop出來(lái)的時(shí)候肯定會(huì)有沖突
解決方案同樣是處理沖突,這里就不再贅述了
reset
第一篇文章中有說(shuō)到根據(jù)status中的提示染乌,add和commit都可以回撤山孔,那push后肯定也有對(duì)應(yīng)的操作。
可以看到至少有兩個(gè)文件是在本次的push中進(jìn)行的荷憋,要想撤回push,首先得知道push了啥褐望,都有哪些push
通過(guò)git log來(lái)查看勒庄,但是git log有很多騷操作(就是美化)串前,最常用的就是以下幾種
-
啥都不加,輸出全部且冗長(zhǎng)
-
輸出前幾個(gè)实蔽,
git log -p
-
單行輸出荡碾,
git log --oneline
當(dāng)然是可以組合的,
git log --oneline -2
自然就是單行輸出前2條記錄局装。
不難看到坛吁,每次的提交主題都是一串?dāng)?shù)字(版本號(hào))和commit時(shí)候的消息,當(dāng)我們想回退到其他版本的時(shí)候铐尚,就可以git reset [版本號(hào)]
即可拨脉。我知道網(wǎng)上關(guān)于reset也有很多騷操作,回退前多少次啥的宣增,但是都不如查看版本號(hào)回退來(lái)得好使玫膀,非要用的時(shí)候查一下就好了。
加入我要回退到上個(gè)版本爹脾,只需要這樣做
可以看到原本push的兩個(gè)文件現(xiàn)在已經(jīng)變成了待提交的狀態(tài)帖旨。
創(chuàng)作不易,如果對(duì)你有幫助灵妨,歡迎點(diǎn)贊解阅,收藏和分享啦!