工作中git填坑之路,有時候用小烏龜,有時候也用git命令。
整理哈git相關內容。 時間不充足,就懶的把每個知識點抽出來細分了。
- git 如何管理多個專案倉庫?
1. git subtree 實現管理多倉庫
A、 B 、 lib 都是倉庫,其他lib是公共模組,在A,B中都有使用
優點: 提交方便,直接在當前專案目錄就可修改公共模組lib並提交
在專案A 和 B 中建立公共模組Common
git subtree add --prefix=src/Common https.xxx.git master
在專案中A 修改公共模組Common後提交
git subtree push --prefix=src/Common https.xxx.git master
在專案B中 拉取公共模組Common,此時也同步了commit修改的內容
git subtree pull --prefix=src/Common https.xxx.git master
操作例子:
2. git submodule 實現管理多倉庫
缺點: submodule新增子模組lib,如修改了lib ,提交子模組必須在子模組lib的專案如lib中才行。
git submodule add http://xxx.xxx/lib.git
git submodule add http://xxx.xxx/module.git
3. git subtree 與 git submodule區別?
subtree與submodule的作用是一樣的,但是subtree出現得比submodule晚,它的出現是為了彌補submodule存在的問題:
submodule不能在父版本庫
(project1,project2)中修改子版本庫的程式碼,只能在子版本庫(lib)中修改,是單向的;
submodule沒有直接刪除子版本庫的功能;
- git版本回退
注意!!!: 當然操作需慎重,避免萬劫不復...
注意!!!: head^^ 或 head~2 形式可指定回退多少
git reset 回退版本,移除不要的版本。 head指標往前移
結果:直接刪除指定的commit
hard回退
- 版本回退後,
暫存區和工作區一致
。 再推到遠端。覆蓋度之前不要的版本。並且不保留記錄
。
git reset --hard head
soft回退
-
版本回退後,
暫存區依舊有原來的commit,實際工作區的內容依舊存在
。 -
實質:就是刪除最近(某個)的寫錯或者不想要的commit資訊,但不影響工作區
-
場景:刪除最近的commit資訊
git reset --soft head
git revert 撤銷某次提交【回滾提交】,新建一個提交。 head指標往後移 。
結果:用一次新的commit來回滾之前的commit,在建立一個新的commit
優點:會保留完整的歷史提交記錄
git revert --hard head
git revert --soft head
- 將feature分支的某個檔案f.txt合併到master分支上。
git checkout master
git checkout --patch feature f.txt
- 修改歷史提交程式碼的commit資訊
1. git 如何修改最近一次的commit資訊
-
git commit --amend
-
進入vim操作介面之後, 點選字母鍵 i 然後進入INSERT模式,然後對commit資訊進行修改,然後ESC 然後 :wq 儲存退出
-
然後執行 git log 會發現最近的一次commit資訊被修改成功了
2. git 修改已經提交到git遠端倉庫的commit資訊
-
首先回撤到上一次提交,不修改本次提交的改動
git reset --soft HEAD~1
-
重新做一次提交
git commit -m “重新提交commit資訊” -
強推本地分支到遠端倉庫 git push -f origin master
-
檢視遠端倉庫中的是否已經修改commit資訊
git恢復 stash丟失的內容
找回丟失的STASH~
如果執行git stash pop之後將恢復的內容被手動刪掉了(比如手賤點了vsCode的Discart All Changes,剛恢復的所有東西都消失了~~)
由於git stash pop恢復的同時把stash內容也刪掉, 所以stash list不再會有之前的stash。
但是git stash pop出的change是可以找回的,因為每次git stash都會生成一個新的commit,只要知道commitID, 透過git stash apply commitID 就可以應用之前的stash
尋找commitID有兩種方法:
1、git stash pop 最後會列印出pop掉的commitid值,若這個記錄還存在直接使用即可。
2、git fsck --lost-found, 會列印出所有dangling commit,慢慢找就行了。一般是最近的幾個
- git取消合併
git merge --abort
-git打標籤tag
git tag
git tag -a Test1.0 -m "釋出Test1.0正式版本"
git tag
git push origin Test1.0
- git 本地倉庫 與 遠端倉庫關聯遇到報錯
git remote add origin https://gitee.com/xxx.git
git branch --set-upstream-to=origin/master
git push -u origin master
1.遇到報錯 failed to push some refs to 'https://gitee.com/xxx.git'
根本原因:本地 和 遠端 內容不匹配 或 許可權不足問題
解決:最好保證程式碼一定是最新的。
git push -f -u origin master(master為指定分支)
2. git pull時報錯fatal: refusing to merge unrelated histories
解決:
git pull origin master --allow-unrelated-histoories