變化總是存在。
如果有一天,你們代碼倉庫伺服器挂了怎麼辦?
如果有一天,你們需要分離測試與線上代碼倉庫,那怎麼合并代碼,手工合并嗎?
如果你們好多個版本,不同的版本對應不同的使用者,使用者希望他們的代碼倉庫在他們的伺服器而不是你的,怎麼辦?
千萬不要相信那些諸如"你先弄過去,以後代碼丢給他們就不管了"的鬼話。如果你信了,你真的建立一個倉庫,把代碼推到新倉庫上了。當新的需求 "把最新版本合并到xxx的代碼上",你就懵逼了,這都不是一個源,怎麼合并。一行行代碼去查嗎?

多個遠端倉庫
git可以添加多個遠端位址,最最重要的是隻要這些遠端倉庫的代碼從相同的commit分出來的,都可以合并。
假設現在有一個本地區域網路的倉庫,然後我想要添加一個github的遠端位址,但是我隻希望我release的版本釋出到github上。
1) 添加遠端位址,指定遠端位址名稱
git remote add github git://github.com/user/test.git
複制
上述指令添加了一個名為github的遠端位址。
使用
git remote
檢視遠端位址清單.
使用
git remote -v
顯示遠端詳情
2) 然後将本地倉庫推到指定遠端即可:
git push 遠端名稱 遠端分支名
對我個人而言,都是建立一個本地分支與遠端分支對應。對于本地而言,不同的遠端倉庫位址都是不同的分支而已。隻是在push的時候小心,不要把代碼推到不該推的倉庫就可以了。
釋出的時候隻保留一個commit記錄
一般代碼合并的時候都是使用merge直接合并。但是merge有個問題就是會把詳細的送出記錄合并過去。對于一些項目釋出,在釋出版本上其實不需要記錄過多的開發細節。隻需記錄釋出日志資訊。這個時候就需要merge --squash了。
git merge dev --squash
git commit -m 'relase version2'
git push
複制
上述指令會将dev分支的變更進行合并,但是不會使用dev的commit資訊,而是需要再自己手動釋出一個commit。
merge之前分支情況:
merge之後分支情況:
merge--squash之後分支情況:
保持分支幹淨rebase
如果你有強迫症,每次看到各個分支之間的連接配接網絡就抓狂,不想看到下面的場景:
那你可能需要使用rebase來合并代碼。
關于rebase的介紹可以參考官方文檔
git rebase 需要合并的分支名稱
複制
以下是rebase前後的一個效果展示
使用git rebase 之後:
可以看到,git rebase 時候合并後的分支非常幹淨,看到的送出記錄就好像整個開發過程在目前分支串行完成的一樣。
rebase修改曆史commit
假如在上調試的時候,送出了很多次類似于'fix error'之類的送出資訊像下面這樣的:
怎麼把這些資訊壓縮到一個commit裡面呢?這裡還是使用到rebase
比如上面的送出記錄,我需要合并'fix1','fix2','fix3','fix5'到一個commit 'fix error before online'裡面
首先找到fix1前一個記錄的hash,然後使用
git rebase -i hash
。指令會把hash之後的commit都列出來,開發人員決定保留那些(pick),删除哪些(squash)。然後按照指令提示重新編寫送出資訊即可。合并之後的送出記錄如下:
删除本地commit
對于本地已經commit但是還沒有push的情況下
1、保留本地修改:
git reset commit_id
丢棄commit,但是保留檔案修改,commit_id是本地的commit
2、完全撤銷到修改前狀态
git reset --hard commit_id
commit_id是修改前最後一個commit_id
以上就是工作中會用的比較多的git操作。當然git還有很多操作可以很好的幫助我們管理代碼,還得好好學習。