0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

開(kāi)發(fā)人員在使用Git時(shí)幾種常見(jiàn)錯(cuò)誤

zhKF_jqr_AI ? 來(lái)源:未知 ? 作者:李倩 ? 2018-11-08 09:17 ? 次閱讀

無(wú)論是數(shù)據(jù)科學(xué)家、算法工程師還是普通開(kāi)發(fā)人員,在每個(gè)團(tuán)隊(duì)協(xié)作開(kāi)發(fā)任務(wù)中,Git都是必不可少的版本控制工具,因此掌握它的基本操作十分有必要。但即便是教程滿天飛的今天,開(kāi)發(fā)人員在使用Git時(shí)也還是會(huì)犯一些不應(yīng)該犯的錯(cuò)誤。本文總結(jié)了其中的幾種常見(jiàn)錯(cuò)誤,希望能對(duì)新手有所幫助。

force push

有時(shí),我們會(huì)需要用force push把commit推送到遠(yuǎn)端倉(cāng)庫(kù)。

假設(shè)有2名開(kāi)發(fā)人員正在合作開(kāi)發(fā)一個(gè)分支

之前開(kāi)發(fā)人員1已經(jīng)完成更改,把代碼push到了遠(yuǎn)程倉(cāng)庫(kù)

現(xiàn)在,開(kāi)發(fā)人員2也完成了更改,正當(dāng)他準(zhǔn)備提交時(shí),他卻發(fā)現(xiàn)自己無(wú)法將代碼推送到遠(yuǎn)程倉(cāng)庫(kù)

由于開(kāi)發(fā)人員2是個(gè)初學(xué)者,他Google了一下,發(fā)現(xiàn)了一個(gè)神奇的命令git push -f,于是進(jìn)行了強(qiáng)制push

之后開(kāi)發(fā)人員1在檢查遠(yuǎn)程倉(cāng)庫(kù)時(shí),發(fā)現(xiàn)自己編寫(xiě)的代碼全消失了

出現(xiàn)這個(gè)問(wèn)題的原因是force push會(huì)覆蓋遠(yuǎn)程倉(cāng)庫(kù)中的代碼,使現(xiàn)有代碼全部丟失。

如果開(kāi)發(fā)人員2想避免這個(gè)問(wèn)題,一種理想方法是他先把開(kāi)發(fā)人員1的更新從遠(yuǎn)程倉(cāng)庫(kù)pull到本地,然后把自己的代碼rebase一下,再進(jìn)行push。這里我們討論的是在同一分支中從遠(yuǎn)程到本地倉(cāng)庫(kù)的rebase。

git push -f這個(gè)命令非常不安全,除非有絕對(duì)的必要,大家最好還是不要用它。它會(huì)把本地分支的提交覆蓋遠(yuǎn)程推送分支的提交,給協(xié)作的同伴帶去不少麻煩,即便是上面的解決方案,它也可能存在一個(gè)時(shí)間差的問(wèn)題,因?yàn)槟悴豢赡軙r(shí)刻掌握同伴的工作進(jìn)展。

所以如果大家都用正確的git工作流,讓每個(gè)開(kāi)發(fā)人員都擁有自己的功能分支,這種情況根本不會(huì)發(fā)生。

Rebase

如果你想把一個(gè)分支的修改合并到當(dāng)前分支,你可以用git rebase。它和git merge的區(qū)別是merge有一個(gè)合并commit的步驟,而rebase是把所有commit都串聯(lián)在一起,讓你本地的分支歷史看起來(lái)像沒(méi)有經(jīng)過(guò)任何合并一樣。

假設(shè)有2名開(kāi)發(fā)人員正在合作開(kāi)發(fā)一個(gè)功能分支

開(kāi)發(fā)人員1率先完成了一系列commit,并將其推送到遠(yuǎn)程功能分支

之后,開(kāi)發(fā)人員2把遠(yuǎn)程功能分支的最新更改pull到本地

開(kāi)發(fā)人員2向本地功能分支添加了一堆commit

這時(shí),他想把本地倉(cāng)庫(kù)的更新重新rebase到遠(yuǎn)程倉(cāng)庫(kù)中,于是他把整個(gè)預(yù)發(fā)分支(release branch)在本地功能分支上rebase了一下。這里我們討論的是在不同分支中從遠(yuǎn)程到本地倉(cāng)庫(kù)的rebase

現(xiàn)在,開(kāi)發(fā)人員2試著把代碼push到遠(yuǎn)程功能分支上,由于提交歷史記錄已更改,這個(gè)操作不被允許,他只能又開(kāi)始用git push -f

最后,當(dāng)開(kāi)發(fā)人員1想從遠(yuǎn)程倉(cāng)庫(kù)提取最新代碼時(shí),由于提交記錄已更改,他被迫需要處理大量代碼沖突問(wèn)題

常規(guī)rebase

開(kāi)發(fā)人員2的操作

如上圖所示,rebase遠(yuǎn)程倉(cāng)庫(kù)會(huì)改變提交歷史記錄,并在其他開(kāi)發(fā)人員嘗試從遠(yuǎn)程倉(cāng)庫(kù)中提取最新代碼時(shí)產(chǎn)生問(wèn)題。處理這種情況的理想方法是始終只rebase本地倉(cāng)庫(kù),本地倉(cāng)庫(kù)中的任何commit都不應(yīng)該被push到遠(yuǎn)程倉(cāng)庫(kù)。

如果別人事先已經(jīng)把commit推送到遠(yuǎn)程功能分支,那么你最好先用pull命令把更新拉到本地,用merge和你的修改合并,因?yàn)閙erge不會(huì)改變提交歷史,而rebase會(huì)。

此外,和上個(gè)問(wèn)題一樣,如果使用正確的git工作流,每個(gè)開(kāi)發(fā)人員都會(huì)有自己的功能分支,這時(shí),開(kāi)發(fā)者在自己的功能分支上進(jìn)行更新并且在遠(yuǎn)程功能分支上做rebase是不會(huì)報(bào)錯(cuò)的,因?yàn)闆](méi)有其他開(kāi)發(fā)人員從同一個(gè)遠(yuǎn)程功能分支中提取代碼。無(wú)論如何,盡量避免重新定義遠(yuǎn)程倉(cāng)庫(kù)。

Rebase是一個(gè)非常強(qiáng)大的功能,使用時(shí)也需謹(jǐn)慎。

amend

git amend命令的作用是修復(fù)最近一次commit,讓你合并你緩存區(qū)的修改和上一次commit,而不是提交一個(gè)新的快照。這里需要注意一點(diǎn),它不是修改最近一次commit,而是整個(gè)替換掉原commit,所以對(duì)Git來(lái)說(shuō)這是一個(gè)新的commit。此外,它還可以用來(lái)編輯上一次的commit描述。

假設(shè)有2名開(kāi)發(fā)人員正在合作開(kāi)發(fā)一個(gè)功能分支

開(kāi)發(fā)人員1率先完成了commit,并將其推送到遠(yuǎn)程功能分支,我們把它稱(chēng)為“old commit”

之后,開(kāi)發(fā)人員2把最新代碼從遠(yuǎn)程功能分支pull到本地功能分支

然后他開(kāi)始處理本地倉(cāng)庫(kù)中的代碼,在這個(gè)過(guò)程中,他沒(méi)有向遠(yuǎn)程倉(cāng)庫(kù)push任何commit

這時(shí)開(kāi)發(fā)人員1突然發(fā)現(xiàn)之前的commit中存在bug,他用amend命令修復(fù)了本地倉(cāng)庫(kù)里的最近一次commit,我們把它稱(chēng)為“new commit”

開(kāi)發(fā)人員1嘗試把這個(gè)新commit重新push到遠(yuǎn)程功能分支,由于提交歷史記錄發(fā)生了變化,這個(gè)操作報(bào)錯(cuò)了,于是他調(diào)用了git push -f

現(xiàn)在,當(dāng)開(kāi)發(fā)人員2想從遠(yuǎn)程功能分支中提取最新代碼時(shí),git會(huì)注意到提交歷史記錄的變化并創(chuàng)建合并的commit。因此當(dāng)他pull到本地后,他會(huì)在本地倉(cāng)庫(kù)里發(fā)現(xiàn)“commit old”和“commit new”,這就破壞了amend這個(gè)操作的意義。

最后,即便開(kāi)發(fā)人員2從遠(yuǎn)程分支到本地分支執(zhí)行rebase,這個(gè)“commit old”還是會(huì)出現(xiàn)在本地倉(cāng)庫(kù)中,它仍然會(huì)作為歷史提交的一部分。

amend commit會(huì)更改提交歷史記錄,所以當(dāng)其他開(kāi)發(fā)人員嘗試從遠(yuǎn)程倉(cāng)庫(kù)提取最新代碼時(shí),修改遠(yuǎn)程倉(cāng)庫(kù)中的commit會(huì)產(chǎn)生混淆。

為了避免這個(gè)錯(cuò)誤,最好的方法是只在本地倉(cāng)庫(kù)里修改commit,不要對(duì)遠(yuǎn)程庫(kù)里的commit做任何修改。當(dāng)然,一人一個(gè)分支也不會(huì)出現(xiàn)這個(gè)問(wèn)題。

Hard reset

git reset命令是用來(lái)將當(dāng)前branch重置到另外一個(gè)commit的。它不會(huì)產(chǎn)生commit,而是只更新一個(gè)branch(branch本身就是一個(gè)指向一個(gè)commit的指針)指向另外一個(gè)commit。

Hard reset的命令是git reset --hard

此外,git reset還有--soft和--mixed,只不過(guò)它們都沒(méi)有Hard reset那么不安全

假設(shè)開(kāi)發(fā)人員1正在開(kāi)發(fā)一個(gè)功能分支,并在本地倉(cāng)庫(kù)中完成了5次commit

與此同時(shí),他還正在處理尚未提交的兩個(gè)文件

這時(shí),如果他運(yùn)行了git reset --hard

那么功能分支中的最新commit會(huì)變成是commit4,commit5丟失

同時(shí)他正在處理的那兩個(gè)未提交文件也會(huì)丟失

這時(shí)commit5還在git內(nèi)部,只不過(guò)對(duì)它的引用丟失了,我們可以用git reflog把它恢復(fù),但總體來(lái)說(shuō),hard reset還是很不安全。在git中使用reset命令時(shí)要非常小心,如果必須得用,確保你已經(jīng)完全評(píng)估所有情況。

小結(jié)

綜上所述,為了避免使用git時(shí)出錯(cuò),我們可以牢記這幾條教訓(xùn):

避免多人在同一分支上協(xié)作。上述四個(gè)例子中有三個(gè)都是在說(shuō)明這個(gè)問(wèn)題,在日常工作中,遵守正確的工作流非常重要,要確保只有一個(gè)人在一個(gè)功能分支上工作,這是技術(shù)主管、高級(jí)開(kāi)發(fā)人員尤其需要注意的。

不要到處實(shí)用force push。

如果萬(wàn)不得已必須使用force push,先評(píng)估其他方案,把它作為最后的手段。

不要試圖修改遠(yuǎn)程倉(cāng)庫(kù)里的commit,要只在本地倉(cāng)庫(kù)中更改commit歷史記錄。但即便是在本地倉(cāng)庫(kù)里,用rebase還是要謹(jǐn)慎。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68616
  • Git
    Git
    +關(guān)注

    關(guān)注

    0

    文章

    199

    瀏覽量

    15765

原文標(biāo)題:實(shí)用:Git中的一些常見(jiàn)錯(cuò)誤

文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于FPGA的單線聚合(SWA)——適用于FPGA開(kāi)發(fā)人員和非FPGA開(kāi)發(fā)人員

    擁有FPGA設(shè)計(jì)經(jīng)驗(yàn)的開(kāi)發(fā)者還能自定義該解決方案。即便沒(méi)有FPGA設(shè)計(jì)經(jīng)驗(yàn),開(kāi)發(fā)人員依然能夠輕松快速完成部署。
    發(fā)表于 10-21 10:17 ?1814次閱讀
    基于FPGA的單線聚合(SWA)——適用于FPGA<b class='flag-5'>開(kāi)發(fā)人員</b>和非FPGA<b class='flag-5'>開(kāi)發(fā)人員</b>

    RemoTI基本遠(yuǎn)程開(kāi)發(fā)人員指南

    `RemoTI基本遠(yuǎn)程開(kāi)發(fā)人員指南目錄`
    發(fā)表于 03-16 16:28

    高價(jià)尋找matlab快速開(kāi)發(fā)人員

    高價(jià)尋找matlab快速開(kāi)發(fā)人員
    發(fā)表于 04-04 15:38

    TS-5400開(kāi)發(fā)人員培訓(xùn)

    TS-5400開(kāi)發(fā)人員培訓(xùn)
    發(fā)表于 10-09 08:54

    開(kāi)發(fā)人員看的視頻

    英特爾?軟件頻道旨在通過(guò)向開(kāi)發(fā)人員提供示例,教程,提示,技巧以及如何將開(kāi)發(fā)人員與影響者,創(chuàng)新者聯(lián)系起來(lái),幫助他們。
    的頭像 發(fā)表于 11-01 06:26 ?2397次閱讀

    什么是英特爾開(kāi)發(fā)人員專(zhuān)區(qū)

    什么是英特爾?開(kāi)發(fā)人員專(zhuān)區(qū)? 觀看此視頻,了解正在使用工具和資源滿足編碼需求的軟件開(kāi)發(fā)人員
    的頭像 發(fā)表于 11-12 06:55 ?2487次閱讀

    WebVR:開(kāi)發(fā)人員使用的資源介紹

    這是WebVR系列的最后一集。 在這里,我們將向您介紹一些可供開(kāi)發(fā)人員和愛(ài)好者使用的資源。
    的頭像 發(fā)表于 11-12 06:05 ?1910次閱讀

    英特爾開(kāi)發(fā)人員專(zhuān)區(qū):Android開(kāi)發(fā)

    Android *英特爾?開(kāi)發(fā)人員專(zhuān)區(qū)
    的頭像 發(fā)表于 05-31 09:37 ?2919次閱讀

    Intel開(kāi)發(fā)人員專(zhuān)區(qū)

    Intel?開(kāi)發(fā)人員專(zhuān)區(qū)
    的頭像 發(fā)表于 05-31 09:24 ?1616次閱讀

    開(kāi)發(fā)人員的應(yīng)用程序和網(wǎng)絡(luò)安全

    Whitehat Security研究發(fā)現(xiàn),大多數(shù)開(kāi)發(fā)人員都將安全性視為編碼和開(kāi)發(fā)過(guò)程的組成部分,但是該行為卻缺乏來(lái)自安全專(zhuān)家的支持。 據(jù)悉,WhiteHat Security本周四發(fā)布了一份報(bào)告
    的頭像 發(fā)表于 11-22 11:01 ?3276次閱讀

    物聯(lián)網(wǎng)參考設(shè)計(jì)開(kāi)發(fā)人員如何縮短設(shè)計(jì)周期

    滿足對(duì)速度的需求Ignion的開(kāi)發(fā)環(huán)境也有助于物聯(lián)網(wǎng)參考設(shè)計(jì)人員、開(kāi)發(fā)人員和最終的制造商縮短其設(shè)計(jì)周期。借助于Ignion的技術(shù),從數(shù)千種潛在可用的、彼此不同的天線中找到合適選項(xiàng)的過(guò)程,被縮減到從
    的頭像 發(fā)表于 11-01 10:14 ?2323次閱讀

    IoT 開(kāi)發(fā)人員必須考慮設(shè)計(jì)和安全性

    IoT 開(kāi)發(fā)人員必須考慮設(shè)計(jì)和安全性
    的頭像 發(fā)表于 01-03 09:45 ?525次閱讀

    IzoT BACnet 開(kāi)發(fā)人員指南

    IzoT BACnet 開(kāi)發(fā)人員指南
    發(fā)表于 03-13 19:31 ?1次下載
    IzoT BACnet <b class='flag-5'>開(kāi)發(fā)人員</b>指南

    IzoT BACnet 開(kāi)發(fā)人員指南

    IzoT BACnet 開(kāi)發(fā)人員指南
    發(fā)表于 07-04 20:48 ?0次下載
    IzoT BACnet <b class='flag-5'>開(kāi)發(fā)人員</b>指南

    MSPDebugStack開(kāi)發(fā)人員指南

    電子發(fā)燒友網(wǎng)站提供《MSPDebugStack開(kāi)發(fā)人員指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-05 14:49 ?0次下載
    MSPDebugStack<b class='flag-5'>開(kāi)發(fā)人員</b>指南