GIt各種版本回退命令
1、git文件已修改但還沒有提交到暫存區時,可以使用git checkout -- <file> 來放棄工作目錄文件的修改
注意:
一旦放棄修改,文件會恢復到上一個暫存狀態,即git add之後所做的所有修改都沒有了;
只有修改還沒有git add提交到暫存區時可以使用git checkout -- <file> ;
-- 很重要,如果沒有的話就是分支切換的命令了;
未跟蹤的文件不能使用此命令放棄修改;
2、git文件已git add提交暫存區,可以使用git reset HEAD <file>命令退出暫存區
對於某文件xxx 的修改已經提交到暫存區後 ,git diff --cached可以查看到變更,執行git reset HEAD xxx 後,xxx wenjian 狀態變爲已修改未入暫存區,需要再執行git checkout -- xxx 才能將修改從文件中刪除。
3、git文件已git commit提交本地數據庫,可以執行git reset --hard commitID回退版本
git reset --hard HEAD^ 回退當前分支到上一版本。用HEAD表示當前版本,也就是最新的提交
上一個版本就是HEAD^,上上一個版本就是HEAD^^,往上100個版本寫成HEAD~100。
git reset --hard xxxxxxx ,xxxxxxx 是歷史提交commitid的前幾位。只要知道提交的版本號,就可以切換到任何一個提交點上(本地還沒有推送到遠程倉庫的提交回退後,如沒有記錄commitID就無法再回退回來)
注意:
修改被git add提交到暫存區、git commit提交到版本庫後都可以使用git reset回退版本
git reset回退的只是本地庫的版本,不能影響到遠程倉庫。使用git pull更新後還可以更新到遠程庫最新版本。
4、git文件已提交本地數據庫或推送到遠程倉庫,可以執行git revert回退版本
git revert 撤銷某次操作,某次操作之前和之後的commit和history都會保留,並且把這次撤銷作爲一次最新的提交
git revert HEAD 撤銷前一次 commit
git revert HEAD^ 撤銷前前一次 commit
git revert commitID
git revert是提交一個新的版本,將需要revert的版本的內容再反向修改回去,版本會遞增,不影響之前提交的內容
注意:撤銷指定的版本,撤銷也會作爲一次提交進行保存。revert之後可以直接git push
5、有依賴關係的操作撤銷時會被拒絕,併產生衝突,需要解決衝突後才能撤銷或取消撤銷
解決辦法一:根據git status提示回退衝突後取消該次撤銷操作
解決辦法二:手動解決衝突完成該次撤銷
git 分支與git tag的常用命令
git分支
git 中的分支,其實本質上僅僅是個指向 commit 對象的可變指針。Git 會使用 master 作爲分支的默認名字。HEAD是指向正在工作中的本地分支的指針。
git創建、刪除分支很容易,因此鼓勵開發者頻繁使用分支。
git branch 查看本地所有分支
git branch -r 查看遠端所有分支
git branch -a 查看本地及遠端所有分支
$ git branch -a
master
* master-origin
remotes/origin/Branch_master
remotes/origin/Branch_master1
remotes/origin/HEAD -> origin/master
remotes/origin/master
*標示本地當前分支
git branch ‘newbranch’ 本地創建新分支
git branch <branch> <commitID> 以某個commit提交創建新分支
注意:拉分支前要將修改合入,否則會將修改也帶到新拉的分支上
git push remote-name ‘分支名’ 本地分支推送到遠程倉庫
刪除分支前,需要先切換到另外一個分支上
git branch -d ‘要刪除的本地分支名’ 刪除本地分支
git push [遠程名] :[分支名] 刪除遠程分支
git checkout ‘分支名稱’ 切換當前分支
git checkout -b ‘新分支名稱’ 本地創建並切換到新分支
git checkout -t ‘分支名稱’ 與遠程分支建立跟蹤,之後可以直接更新、推送代碼
從遠程分支檢出的本地分支,稱爲跟蹤分支(tracking branch)。跟蹤分支是一種和遠程分支有直接聯繫的本地分支。在跟蹤分支裏輸入 git push,Git 會自行推斷應該向哪個服務器的哪個分支推送數據。
反過來,在這些分支裏運行git pull 會獲取所有遠程索引,並把它們的數據都合併到本地分支中來。
在克隆倉庫時,Git 通常會自動創建一個 master 分支來跟蹤 origin/master。這正是 git push 和 git pull一開始就能正常工作的原因。
當然,你可以隨心所欲地設定爲其它跟蹤分支,比如 origin 上除了 master 之外的其它分支。
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
或者使用checkout -b [分支名] [遠程名]/[分支名],創建一個本地分支並自動關聯到遠程分支.
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"
現在你的本地分支 sf 會自動向 origin/serverfix 推送和抓取數據了。
或者使用checkout -t [遠程名]/[分支名],本地自動創建一個與遠程分支名字相同的分支並與之對應追蹤關係.
$ git checkout -t origin/serverfix
git標籤
git tag <name> 在當前分支最新版本打name命名的輕量級標籤
git tag 查看所有標籤。標籤不是按時間順序列出,而是按字母排序的
git tag <name> commitID 在當前分支commitID版本打name命名的標籤
git show <tagname> 查看標籤信息
git tag -a <name> -m “標籤說明信息” 打帶有附註說明的標籤
git push origin <tagname> 推送本地標籤到遠端
git push origin --tags 一次性推送全部尚未推送到遠程的本地標籤
git tag -d <tagname> 刪除本地標籤
git push origin :refs/tags/ <tagname> 刪除遠程標籤
git push origin --delete tag <tagname> 刪除遠程標籤
注意:
打標籤前需要先切換到需要打標籤的分支
指向Git標籤的指針不能移動,所以git的標籤不能提交修改
git時遇到的一些問題總結:
1、出現remote reject,
嘗試
git pull --rebase
再次push
原因分析:可能是與remote庫提交記錄不一致;
2、提交後,評審不通過或者CI不通過,
修改後使用
git commit --amend
並再次push
原因分析:change-id需要變更;
3.別人提交了代碼,與本地有衝突
需要先git stash將修改的暫時保存一下,
然後 git pull --rebase
然後git stash pop 再通過該命令將暫存的彈出來
如果之前有修改未通過,需要git commit --amend 再次commit一下
最後 git push origin HEAD:refs/for/master%[email protected] 提交review
4、提交了不想提交的東西,還沒有push,撤銷commit
1) git reset HEAD~ 這一步不會讓你的工作區(你磁盤上文件的狀態)發生改變,但是會撤銷上次的commit,並且將你第一步commit的那些改動從暫存區移除(所以當你再次使用git status查看狀態的時候,它們會出現在‘Changes not staged for commit’這句話的下面。提交他們之前,你需要再把它們add一次)
###修改文件
2)git add .
3)git commit -m "0110-KW"
4)git push origin HEAD:refs/for/master%[email protected]
5、git merge 之後push被拒絕
[remote rejected] HEAD -> refs/for/master%[email protected] (you are not allowed to upload merges)
git pull --rebase後再提交
6、查看到未傳送到遠程代碼庫的提交詳情
git log master ^origin/master ^origin/master 可改成其它分支
7、更新本地分支
1) git checkout local_branch
2) git rebase master ---此處應當是跟本地的主分支rebase
3) 如果這中間出現了conflict,手工解決後,用 git add xxx.file 來更新衝突文件的索引
4) git rebase --continue 繼續合併
5)在git rebase的過程中,可以通過--abort參數終止rebase,並回到rebase開始前的狀態
對於那些長時間不往主分支push的分支,建議儘量及時rebase上游分支,有衝突提前就fix掉,這樣即使這個分支開發了很長時間,提交時也不會太麻煩
8、git stash的使用
在開發過程中,大家都遇到過bug,並且有些bug是需要緊急修復的。當開發人員遇到這樣的問題時,首先想到的是我新切一個分支,把它修復了,再合併到master上。當時問題來了,你當前正在開發的分支上面,還有未提交的代碼,你又不想把代碼提交了,怎麼辦呢?git提供了stash功能,把當前工作目錄現場給存儲起來,等修復完bug,再切回來。
當前分支上, git stash先把修改的內容暫存;
master上新建分支new_branch,開發緊急任務
git add . / git commit -m "xxxx" / push
切回master分支,git merge new_branch把修改的緊急任務合併到master
git stash list查看暫存內容
git stash pop (或者git stash apply stash@{1})恢復暫存的內容,git stash drop stash@{1}來刪除某個stash
git stash pop出現以下錯誤:
Auto-merging anyservice-iecs/src/com/zte/anyservice/iecs/ros/virtual/zxve/virtualmachine/vmtemplate/action/ZxveTemplateAction.java
CONFLICT (content): Merge conflict in anyservice-iecs/src/com/zte/anyservice/iecs/ros/virtual/zxve/virtualmachine/vmtemplate/action/ZxveTemplateAction.java
很簡單,跟pull 或者 rebase出現衝突一樣,手工合併文件並用git add xxx.file來更新衝突文件的索引。需要注意的是,衝突解決之後,Git並不會刪除之前的stash記錄,可以使用git stash drop將沒用的記錄刪除掉。
9、 git commit歷史中有問題
通過如下流程解決:
1)git log查看commit歷史
2)git rebase -i HEAD~2 表示要修改當前版本的倒數第二次狀態
這個命令出來之後,會出來三行東東:
pick:*******
pick:*******
pick:*******
如果你要修改哪個,就把那行的pick改成edit,然後退出。
這時通過git log你可以發現,git的最後一次提交已經變成你選的那個了,這時再使用:
3) git commit --amend
10、查看當前未push的commit詳情
git status 只能查看未傳送提交的次數
git cherry -v只能查看未傳送提交的描述/說明
git log master ^origin/master則可以查看未傳送提交的詳細信息