衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

開發人員在使用Git時幾種常見錯誤

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

無論是數據科學家、算法工程師還是普通開發人員,在每個團隊協作開發任務中,Git都是必不可少的版本控制工具,因此掌握它的基本操作十分有必要。但即便是教程滿天飛的今天,開發人員在使用Git時也還是會犯一些不應該犯的錯誤。本文總結了其中的幾種常見錯誤,希望能對新手有所幫助。

force push

有時,我們會需要用force push把commit推送到遠端倉庫。

假設有2名開發人員正在合作開發一個分支

之前開發人員1已經完成更改,把代碼push到了遠程倉庫

現在,開發人員2也完成了更改,正當他準備提交時,他卻發現自己無法將代碼推送到遠程倉庫

由于開發人員2是個初學者,他Google了一下,發現了一個神奇的命令git push -f,于是進行了強制push

之后開發人員1在檢查遠程倉庫時,發現自己編寫的代碼全消失了

出現這個問題的原因是force push會覆蓋遠程倉庫中的代碼,使現有代碼全部丟失。

如果開發人員2想避免這個問題,一種理想方法是他先把開發人員1的更新從遠程倉庫pull到本地,然后把自己的代碼rebase一下,再進行push。這里我們討論的是在同一分支中從遠程到本地倉庫的rebase。

git push -f這個命令非常不安全,除非有絕對的必要,大家最好還是不要用它。它會把本地分支的提交覆蓋遠程推送分支的提交,給協作的同伴帶去不少麻煩,即便是上面的解決方案,它也可能存在一個時間差的問題,因為你不可能時刻掌握同伴的工作進展。

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

Rebase

如果你想把一個分支的修改合并到當前分支,你可以用git rebase。它和git merge的區別是merge有一個合并commit的步驟,而rebase是把所有commit都串聯在一起,讓你本地的分支歷史看起來像沒有經過任何合并一樣。

假設有2名開發人員正在合作開發一個功能分支

開發人員1率先完成了一系列commit,并將其推送到遠程功能分支

之后,開發人員2把遠程功能分支的最新更改pull到本地

開發人員2向本地功能分支添加了一堆commit

這時,他想把本地倉庫的更新重新rebase到遠程倉庫中,于是他把整個預發分支(release branch)在本地功能分支上rebase了一下。這里我們討論的是在不同分支中從遠程到本地倉庫的rebase

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

最后,當開發人員1想從遠程倉庫提取最新代碼時,由于提交記錄已更改,他被迫需要處理大量代碼沖突問題

常規rebase

開發人員2的操作

如上圖所示,rebase遠程倉庫會改變提交歷史記錄,并在其他開發人員嘗試從遠程倉庫中提取最新代碼時產生問題。處理這種情況的理想方法是始終只rebase本地倉庫,本地倉庫中的任何commit都不應該被push到遠程倉庫。

如果別人事先已經把commit推送到遠程功能分支,那么你最好先用pull命令把更新拉到本地,用merge和你的修改合并,因為merge不會改變提交歷史,而rebase會。

此外,和上個問題一樣,如果使用正確的git工作流,每個開發人員都會有自己的功能分支,這時,開發者在自己的功能分支上進行更新并且在遠程功能分支上做rebase是不會報錯的,因為沒有其他開發人員從同一個遠程功能分支中提取代碼。無論如何,盡量避免重新定義遠程倉庫。

Rebase是一個非常強大的功能,使用時也需謹慎。

amend

git amend命令的作用是修復最近一次commit,讓你合并你緩存區的修改和上一次commit,而不是提交一個新的快照。這里需要注意一點,它不是修改最近一次commit,而是整個替換掉原commit,所以對Git來說這是一個新的commit。此外,它還可以用來編輯上一次的commit描述。

假設有2名開發人員正在合作開發一個功能分支

開發人員1率先完成了commit,并將其推送到遠程功能分支,我們把它稱為“old commit”

之后,開發人員2把最新代碼從遠程功能分支pull到本地功能分支

然后他開始處理本地倉庫中的代碼,在這個過程中,他沒有向遠程倉庫push任何commit

這時開發人員1突然發現之前的commit中存在bug,他用amend命令修復了本地倉庫里的最近一次commit,我們把它稱為“new commit”

開發人員1嘗試把這個新commit重新push到遠程功能分支,由于提交歷史記錄發生了變化,這個操作報錯了,于是他調用了git push -f

現在,當開發人員2想從遠程功能分支中提取最新代碼時,git會注意到提交歷史記錄的變化并創建合并的commit。因此當他pull到本地后,他會在本地倉庫里發現“commit old”和“commit new”,這就破壞了amend這個操作的意義。

最后,即便開發人員2從遠程分支到本地分支執行rebase,這個“commit old”還是會出現在本地倉庫中,它仍然會作為歷史提交的一部分。

amend commit會更改提交歷史記錄,所以當其他開發人員嘗試從遠程倉庫提取最新代碼時,修改遠程倉庫中的commit會產生混淆。

為了避免這個錯誤,最好的方法是只在本地倉庫里修改commit,不要對遠程庫里的commit做任何修改。當然,一人一個分支也不會出現這個問題。

Hard reset

git reset命令是用來將當前branch重置到另外一個commit的。它不會產生commit,而是只更新一個branch(branch本身就是一個指向一個commit的指針)指向另外一個commit。

Hard reset的命令是git reset --hard

此外,git reset還有--soft和--mixed,只不過它們都沒有Hard reset那么不安全

假設開發人員1正在開發一個功能分支,并在本地倉庫中完成了5次commit

與此同時,他還正在處理尚未提交的兩個文件

這時,如果他運行了git reset --hard

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

同時他正在處理的那兩個未提交文件也會丟失

這時commit5還在git內部,只不過對它的引用丟失了,我們可以用git reflog把它恢復,但總體來說,hard reset還是很不安全。在git中使用reset命令時要非常小心,如果必須得用,確保你已經完全評估所有情況。

小結

綜上所述,為了避免使用git時出錯,我們可以牢記這幾條教訓:

避免多人在同一分支上協作。上述四個例子中有三個都是在說明這個問題,在日常工作中,遵守正確的工作流非常重要,要確保只有一個人在一個功能分支上工作,這是技術主管、高級開發人員尤其需要注意的。

不要到處實用force push。

如果萬不得已必須使用force push,先評估其他方案,把它作為最后的手段。

不要試圖修改遠程倉庫里的commit,要只在本地倉庫中更改commit歷史記錄。但即便是在本地倉庫里,用rebase還是要謹慎。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69057
  • Git
    Git
    +關注

    關注

    0

    文章

    201

    瀏覽量

    15821

原文標題:實用:Git中的一些常見錯誤

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

    RemoTI基本遠程開發人員指南

    `RemoTI基本遠程開發人員指南目錄`
    發表于 03-16 16:28

    高價尋找matlab快速開發人員

    高價尋找matlab快速開發人員
    發表于 04-04 15:38

    TS-5400開發人員培訓

    TS-5400開發人員培訓
    發表于 10-09 08:54

    開發人員看的視頻

    英特爾?軟件頻道旨在通過向開發人員提供示例,教程,提示,技巧以及如何將開發人員與影響者,創新者聯系起來,幫助他們。
    的頭像 發表于 11-01 06:26 ?2431次閱讀

    什么是英特爾開發人員專區

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

    WebVR:開發人員使用的資源介紹

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

    英特爾開發人員專區:Android開發

    Android *英特爾?開發人員專區
    的頭像 發表于 05-31 09:37 ?2962次閱讀

    Intel開發人員專區

    Intel?開發人員專區
    的頭像 發表于 05-31 09:24 ?1654次閱讀

    開發人員的應用程序和網絡安全

    Whitehat Security研究發現,大多數開發人員都將安全性視為編碼和開發過程的組成部分,但是該行為卻缺乏來自安全專家的支持。 據悉,WhiteHat Security本周四發布了一份報告
    的頭像 發表于 11-22 11:01 ?3309次閱讀

    物聯網參考設計開發人員如何縮短設計周期

    滿足對速度的需求Ignion的開發環境也有助于物聯網參考設計人員、開發人員和最終的制造商縮短其設計周期。借助于Ignion的技術,從數千種潛在可用的、彼此不同的天線中找到合適選項的過程,被縮減到從
    的頭像 發表于 11-01 10:14 ?2364次閱讀

    IoT 開發人員必須考慮設計和安全性

    IoT 開發人員必須考慮設計和安全性
    的頭像 發表于 01-03 09:45 ?555次閱讀

    IzoT BACnet 開發人員指南

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

    IzoT BACnet 開發人員指南

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

    MSPDebugStack開發人員指南

    電子發燒友網站提供《MSPDebugStack開發人員指南.pdf》資料免費下載
    發表于 12-05 14:49 ?0次下載
    MSPDebugStack<b class='flag-5'>開發人員</b>指南
    百家乐哪家赌安全| 678百家乐博彩娱乐场开户注册| 奇迹百家乐的玩法技巧和规则| 百家乐官网娱乐人物| 百家乐官网赌场信息| 百家乐官网烫金筹码| 新乐界娱乐城| 百家乐游戏下裁| 百家乐官网高手长胜攻略| 瑞丰国际娱乐城| 百家乐光纤洗牌机如何做弊| 罗马百家乐官网娱乐城| 利来百家乐的玩法技巧和规则| 凯斯网娱乐城| 缅甸百家乐官网娱乐场开户注册 | 太阳城娱乐| 大发888线上娱乐城| 百家乐官网破解的方法| 百家乐小路规则| 属狗的和虎的做生意好吗| 百家乐官网论坛官网| 豪盈国际娱乐| 御金百家乐娱乐城| 百家乐官网去澳门| 大发888娱乐场下载英皇国际| bet365.com| 澳门百家乐国际| 百家乐官网游戏合法吗| 百家乐官网怎么玩| 网上百家乐官网的技巧| 大发888娱乐城怎么样| 保单百家乐官网路单| 网上百家乐官网平台下载| 大发888爱好| 百家乐官网一黑到底| 皇城国际| 互联网百家乐官网的玩法技巧和规则 | 太阳城洋伞官网| 玩网上百家乐官网的技巧| 足球投注网址| 永康百家乐赌博|