git 使用經驗與技巧總結 (不斷更新中)


git 使用技巧總結
 
說明: 本地repo已經有啦,對應的遠程repo 為tiger, 本地分支為master。 
 
問題一:  當拉取代碼的remote repo倉庫為tiger, 而現在要將修改push到remote repo的 develop分支該如何?
 
思路:拉取新的remote_develop_repo_url, 將原有的代碼合並到當前分支, 然后再提交到 remote_develop_repo_url,。
  1. 首先將當前修改提交到本地當前master分支, git commit -m "this is comment"
  2. 然后使用git remote add remote_repo_name url ,來添加新的remote repo, git remote add new_repo url_from_igerrit 
  3. 然后再用git fetch remote_repo_name 來拉取代碼 和 git branch 及其配置到本地,git fetch new_repo
  4. 然后,git checkout -b xx local_url 切換到新分支,  git checkout -b develop new_repo/develop
  5. 然后再將master分支的修改合並到當前分支上, merge命令自動commit了合並后的代碼到新的分支, git merge master 
  6. 然后再用git log 查看下更新的是否生成了 change-id, 否則需要拷貝commit-msg 到當前.git/hook目錄下, git log  (僅針對持續集成服務器需要根據change-id來分辨提交id的情況)
  7. 最后使用git push remote_repo_name  local_branch_name:/refs/for/remote_repo/branch_name 。 git push new_repo develop:refs/to/remote_develop_branch

問題二:

有時為了保存多個工作狀態,會使用多次commit (4次),將狀態提交到本地倉庫,但是在完成編碼后,本想git push 最后的狀態給時,本地的每次提交都會在遠程倉庫也有一個對應的提交(也有4次),造成服務器上出現不必要的版本, 如何處理此問題?使得本地4次,遠程1次?
思路: git似乎沒有直接方法處理這個問題,不過可以考慮在本地建立多分支。 即: 
1. 為本地的四次提交建立一個分支名,以保證其狀態得以記錄。
2. 然后,git reset --soft commit-id 將遠程Head指向到4次提交前的狀態。
3. 本地再次提交,此時由於Head指向四次前,而working Directory是四次修改提交之后的,此時git commit 就可以完成一次完成四次的提交。
這樣既保證了本地有個分支記錄了四次歷史,同時保證服務器上只更新了一次,且狀態一致。
 
命令如下:
1. git checkout -b branch_name ;  先命名新分支,保證當前分支的四次提交以后即使不記得commit id任然可以查找到。
2. git reset --soft commit-id; 指定四次前的id,回退HEAD, 而index和working directory 都是最新的。此時可以進行commit。
3. git diff ; 查看下狀態
4. git log; 確認git 提交歷史
5. git commit -m "4 in one"
6. git push remote-name local_branch:/refs/for/remote_branch
 
以上錯誤。
應該是這樣:首先git log 查看最后一次的commit id, 然后 數一下要退回的commit 次數,直接git reset --mixed HEAD~N , 讓頭部退回, 但是index 和 working dir 保持最新。再次直接commit 即可。
 
 
情形三: 提交時,出現代碼沖突。如何解決?
方法一: 臨鍵分支, 然后會退到上一次commit, 再pull 最新代碼, 然后再與當前分支 merge, 然后再提交。
 
情形四: 如果提交代碼到review服務器后,未能及時通過review,而此時遠程倉庫已經出現了很多提交,導致當前提交無法merge, 怎么辦?
1. 使用git checkout -b newBranchName 復制當前分支,以保證自己之前的代碼提交保持一個備份。
2. git checkout master切換回原來的分支,並git reset --hard xxxxx,退回到上一次提交。
3. 使用 git pull origin master 來拉取服務器上的最新代碼。
4. 使用git cherry-pick xxxxx_commit_idXXXXX  合並自己的代碼到最新的狀態上, 手動解決本地merge沖突。
5. git push origin master:master 即可。
 
 
情形五: 軟件有多個發行版, 其中一個發型版中更新了一個功能,想把這個功能提交到其它發行版的遠程倉庫中, 此時需要怎么辦?
1. cherry-pick 功能可以選擇一個commit-id 來合並,但是只能在同一個倉庫的不同分支。
2. 如果通過添加 git remote add iauto repo_addr_url 的方式的話, 會與本地出現沖突。
3.  通過git remote add  可以將不同遠程倉庫的分支放到同一個本地倉庫的不同分支, 此時只要解決了本地沖突就可以解決了。
git checkout -f 此-f選項可以強制刪除本地沖突, 以遠程為標准。
--此時再用 git cherry-pick 
Done.
 
 
 
 
git 的強大之處:時空倒流
git 的時空倒流法依賴以下三個命令:
1. git reset : --soft --mixed  --hard 三種策略
2. git branch :
3. git checkout :
 
git的強大之處在於
1. 可以隨處建立分支,使得不同功能的開發不會依賴,這樣 不同版本的代碼可以完整地保留下來。
2. 可以隨時將代碼版本倒流到某個正確無誤的時刻, 時光倒流。
3. 可以利用reset 將本地的冗余提交的版本去掉。 
4. 可以使用stash 暫存一系列的零時操作。 空間倒流。
5. 可以讓用戶在本地或者遠程的不同分支上輕松切換,版本的管理非常靈活。(空間倒流)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM