說一下使用git
做版本控制的時候的工作流程
git add -a #需要新增到版本庫中的檔案 -a 就代表著所有檔案(除開了 .gitignore忽略掉的檔案)
git commit -m '本次提交的備註'
git pull #將遠端的庫和本地的庫版本同步一下,因為遠端庫可能發生了修改(多人合作開發時)
git push
這樣操作的前提是本地遠端都是同乙個master
分支上
以上操作前兩步通常不會碰到問題,最容易發生問題的是git pull
這一步
因為多人開發時難免碰到同時修改了同乙個檔案,那麼就會產生衝突
git 是根據檔案每行發生的修改進行的判定的,如果同時對同一檔案的同一行發生了修改,就卡死到這一步上了
我常用的是命令列和 phpstrom 中的版本控制工具,最推薦的是命令列操作,別的圖形介面也是調的命令列介面
直接學會git 的命令是學習成本最低的一種方式,一次學會到處可用啊!
命令列還有個強大的地方就是它的提示通常就是你解決問題的方法,照著提示打就行(要善用提示啊,別看見報錯就慌了)
我們做乙個實驗,我自己的乙個版本庫本地和遠端同時發生了修改,而且是操作的同乙個檔案,
我直接進行git push
操作
看到提示沒?提示中的 hint 中說了,向遠端庫中更新被拒,因為遠端有了修改而本地沒有(說白了就是沒同步),
這通常發生在另乙個版本庫向遠端推送了相同的檔案(就是兩個人在這個版本下同時操作了同乙個檔案),
提示中給出原因之後緊接著給出了解決辦法(e.g., 'git pull ...')before pushing again
,
我們按著它給的提示操作一下
通常如果兩個人之間的操作不發生衝突比如同時修改了同乙個檔案的同一行的情況下就會進入commit
的
編輯介面了,但是我給他人為的造成乙個錯誤,這個錯誤就是我們最常碰到的錯誤,合併衝突
看到提示中的最後一行了沒有?
automatic merge failed; fix conflicts and then commit the result.
自動合併失敗了,請修復衝突並再次提交
如果檔案很多我怎麼去找到它?
第一種方法坑爹的地方就是好多任務具他給你提示就提示一次,你如果給關了就不會再提示了,但是該提交不上去的
還是提交不上去,而且如果是線上火速修復的時候你的編輯器是幫不到那麼遠的
我們選第二種,肯定不是挨個檔案去翻啊!會死人的
有乙個很有用的命令
標紅的檔案都給你了,而且還給你了需要執行的命令,你別假裝看不到啊!當然這個時候直接git add && git commit
會出事的,你還沒解決衝突呢!
我們去這個衝突檔案中解決掉衝突本地能跑通了再提交,而且這個錯誤提示會指名檔案路徑的,我這個衝突檔案
因為正好是在專案的根目錄下才沒有的
開啟這個檔案我們看到如下的內容:
什麼?你說你找不到是誰?你沒看到**衝突塊下的779833d952d8a6557b2e8eba3bd192ede5cb6ca0
這一段文字嗎?你先別激動,這個點還不適合開車,這個是提交的 commit-id,你每次提交都會產生的乙個標識
要檢視這到底是誰和我的**衝突了就執行下面的命令
git log 779833d952d8a6557b2e8eba3bd192ede5cb6ca0
第一行就是你要的結果,
如果直接git log -p
就是列出所有的提交記錄 -p 就是顯示出修改的地方
衝突塊部分 head就是你寫的**,下面的是別人寫的,去掉其中乙個把那些標籤清理乾淨,測試一下沒問題了
再git add && git commit && git pull && git push
這四連技好了,世界清淨了
這是我在 segmentfault 中給出的答案:
比如你從乙個git log為1,2,3,4,5,6
的遠端庫拉取到了本地,
另乙個同事也拉取了同樣的**,而且你的同事先於你提交到遠端了,
此時遠端的版本是1,2,3,4,5,6,7_new,8_new
,
而你當前只是本地的版本1,2,3,4,5,6,7_local,8_local,9_local
從這裡你就能看出你前一部分和遠端的一樣,後一部分和遠端的不一樣,
這個時候你不能正常推送上去的,如果你採取git push origin master --force
那麼遠端的版本就變成了1,2,3,4,5,6,7_local,8_local,9_local
之前你同事推送的7_new,8_new
這兩次推送被覆蓋了,這不是大家想要的情況
因此需要git pull
來將本地的版本合併成樣
1,2,3,4,5,6,7_new,7_local,8_local,8_new,9_local,10_commit_merge
遠端和本地的排序是按當時commit
的時間來排的,最後乙個10_commit_merge
就是你本地和遠端合併的標誌,最後你推送到遠端倉庫的應該也是這個,
因為你們操作的是同乙個庫始終要保持**的同步,所以一旦版本庫發生改動同一分支下的所有人都要跟著去同步他,因為各開發各的直接往上推 git 還沒智慧型到幫你處理衝突的地步
比如我有兩個分支
* alpha
dev
我只要 dev 中的某幾個檔案, 比如 readme.md 和 license.md, 那麼我就
git checkout dev /path/to/readme.md /path/to/license.md
就會拉取 dev 分支中的這幾個檔案覆蓋到 alpha 分支上, 注意拉取的檔案會強制覆蓋, 然後你git diff
一下這幾個檔案看有沒有問題, 直接git commit && git pull && git push
一套帶走就行
答案鏈結
部落格原文
使用git進行團隊合作開發
1.git 和 svn 的差異 git和svn 最大的差異在於git是分布式的管理方式而svn是集中式的管理方式。如果不習慣用 管理工具,可能比較難理解分布式管理和集中式管理的概念。下面介紹兩種工具的工作流程 團隊開發 通過閱讀下面的工作流程,你將會很好的理解以上兩個概念。集中式管理的工作流程如下圖...
git團隊合作開發流程
關於git的環境配置在以前已說過就不羅索了,這裡介紹在公司如何團隊一起開發專案 首先你需要把你的秘鑰給管理員,如何配置以前介紹過了就不說了 進入正題 git ls files檢視當前廠庫被add得所有檔案 git push origin branchname 刪除遠端的branchname分支 gi...
git多人合作開發指令
往往乙個專案是多人開發的,而分支正是用於滿足我們的要求,乙個分支可以交給乙個人開發系統的乙個功能,而系統的總功能在master分支上,這樣不同的分支不會相互影響,當ta開發完以後,通過協調溝通確保 無誤後講分支進行合併到master,即可把完成的某個功能加入到系統的總功能中。或許這是超級無敵精簡的g...