結合IDEA與命令列,解決常用git操作與特殊情況的最佳實踐

本文適合git操作不夠順滑,被各種git問題搞得焦頭爛額的Java業務開發同學。

如果是git的初學者,建議搜尋下git其他入門教程,這方面資料很多,非常推薦git init一個新專案,然後本地操作,邊操作邊觀察工作區、暫存區、本地倉庫和遠端倉庫的變化,這樣就能很快上手。

另外,對於git的初學者,這裡提供個有趣的互動網站,可以輸入git命令之後,立刻透過動畫檢視分支的變化情況。網址:https://learngitbranching。js。org/?locale=zh_CN

由於IDEA git外掛的便捷,平時簡單的git操作或者檢視操作都依賴視覺化選單即可,如非情懷,沒必要非要命令列。但是各種分支操作等複雜操作,還是建議使用命令列,這樣一是比較靠譜,二是能對git的處理邏輯更加了解,更容易舉一反三。

下面介紹都是博主自己的經驗而已,基於git版本為2。23。0,如果你的本地環境是git 1。x的話,結果會有些差異。

結合IDEA與命令列,解決常用git操作與特殊情況的最佳實踐

常見的git系統構成:

Working Directory: 工作區

Staging Area: 暫存區

Repository(Local): 本地倉庫

Repository(Remote): 遠端倉庫

1。檢視資訊

命令列操作

git log ——> 檢視當前分支的git日誌。

git log ——oneline ——> 單行形式檢視當前分支的git日誌。

git reflog ——> 檢視本地的提交變更歷史,並且提交是不區分在哪個分支提交的。常用於恢復本地的錯誤操作。

注:

git log只顯示當前分支所有提交過的版本資訊,不包括已經被刪除的 commit 記錄和 reset 的操作git reflog顯示本地所有分支的操作記錄,包括提交,回退的操作

git remote -v ——> 檢視遠端倉庫地址。

git status ——> 檢視當前git的狀態。非常有用的命令。

git for-each-ref ——count=10 ——sort=-committerdate refs/heads/ ——format=‘%(refname:short)’ ——> 檢視本地最近使用過的10個分支。

IDEA視覺化操作

檢視檔案變更歷史,等同於git show。

結合IDEA與命令列,解決常用git操作與特殊情況的最佳實踐

除了在暫存區的檔案,在工作區的檔案同樣可以在右鍵選單Git中找到“show history”

檢視暫存區程式碼本次修改資訊,等同於git diff。

結合IDEA與命令列,解決常用git操作與特殊情況的最佳實踐

檢視檔案在相比其他分支的版本/之前版本的改動,和第1個操作在同一級目錄,對應選單名分別為:Compare with和Compare with Branch

檢視檔案的每一行最後的修改人,等同於git blame。

結合IDEA與命令列,解決常用git操作與特殊情況的最佳實踐

2。單次提交操作

命令列操作

git add 。 ——> 將所有變化提交到暫存區。

注:由於git外掛會預設將新增檔案增加到暫存區,所以日常開發git add是不需要手動操作。

git rm [filename] ——> 刪除工作區的檔案,並將刪除放到暫存區。

git rm ——cached [filename] ——> 停止追蹤暫存區的檔案,檔案會保留在工作區。

注:上面兩條rm指令敲錯的話也不會有問題,用錯場景的話,會有反饋提示的。但不建議不指定檔名直接用“。”代替,容易誤操作。

git commit 。 ——amend ——> 將暫存區的改動新增到最新一次commit,並可修改最新一次commit的註釋內容。

git commit 。 ——amend ——no-edit ——> 將暫存區的改動新增到最新一次commit,但並不修改最新一次commit的註釋內容。

注:以上兩條指令常用於程式碼已經提交後的重新修改。要注意的是,執行後的最新節點的commitid會發生變化。

git commit ——allow-empty -m “Empty” ——> 提交一個沒有任何檔案變動的提交。

IDEA視覺化操作

提交程式碼,等同於git commit。

可以選擇多個檔案,也可以單選。

結合IDEA與命令列,解決常用git操作與特殊情況的最佳實踐

取消程式碼修改,等同於git revert。

和第1個操作在同一級目錄,“Commit”的下面

選擇一個提交或者多個提交,合併到當前分支等同於git cherry-pick。

結合IDEA與命令列,解決常用git操作與特殊情況的最佳實踐

3。分支操作

命令列操作

git branch ——> 列出所有本地分支;-r 列出所有遠端分支;-a列出所有本地和遠端分支。

git switch [branch_name] ——> 切換分支;branch_name改為“-”,切換到上一個分支。

git checkout -b [new_branch_name] ——> 基於當前分支建立新的分支。

git branch -d [branch-name] ——> 刪除分支。

4。撤銷

命令列操作

git stash ——> 將暫存區的程式碼快取到棧中。

git stash list ——> 顯示棧中所有快取。

git stash pop ——> 將棧中的最近一次儲存pop到暫存區中。

git stash apply ——> 恢復棧中所有的儲存。

git stash clear ——> 清空快取程式碼的棧。

注: git stash指令主要用於切換到突發事情,需要保留現場的時候進行使用。

git reset ——soft [commitId] ——> 將HEAD指標指向commitId,並將commitId(不含)之後的提交放入暫存區。

git reset [commitId] ——> (省略了——mixed,因為——mixed是預設的引數)將HEAD指標指向commitId,不改變工作區,即將commitId(不含)之後的提交變成待提交的狀態)

例如:git reset HEAD^ ——> 將本地倉庫的最新一條commit撤銷,並將最新的修改變成待提交的狀態。

git reset ——hard [commitId] ——> 將本地倉庫的[commitId](不含)之後的提交直接刪除。

git reset ——hard [old_branch_name] ——> 將當前分支還原成同old_branch_name一樣的分支(此時一般不加——soft等其他引數,因為會出現HEAD指標已經移動到目標提交,又多了份提交在工作區或暫存區)

注:

如果有遠端倉庫的話,想要將遠端倉庫的程式碼與本地git reset的程式碼保持一致的話,需要執行git push -f。如果是公用分支的話,要注意執行git push -f的前提是保證你的強制覆蓋不會刪除別人的程式碼。上面兩個命令中,[commitId] 可以替換為HEAD。對於前者,可以取消追蹤暫存區的追蹤;對於後者,可以直接拋棄暫存區的修改。

git revert [commitId] ——> (省略了——edit,因為——edit是預設的引數)新建一個提交,用來還原指定commitId的變動。

注:

——edit可替換成——no-edit,這樣可以跳過編輯commit資訊。——edit可替換成——no-commit,這樣可以讓撤回的提交放到暫存區,不進行提交,使用者自行手動提交。

git revert -m 1 [commitId] ——> 保留merge中主幹分支的修改部分,還原其餘部分(commitId為merge的節點commitId)。如果1改為2,則保留merge中非主幹分支的修改部分,這種操作很少見。

注:

相較於git reset ,git revert不會改變專案歷史,對那些已經發布到共享倉庫的提交來說這是一個安全的操作(git reset會把歷史上某個提交及之後所有的提交都移除掉了)

git rebase -i [commitId] ——> 修改最近的提交。 例如:git rebase -i HEAD~2 ——> 合併最近的兩次提交

執行這個命令後會跳到一個vi編輯器,修改每一行的第一個單詞會有不同的效果:

pick:保留該commit(縮寫:p)

reword:保留該commit,但需要修改該commit的註釋(縮寫:r)

edit:保留該commit, 但要停下來修改該提交(不僅僅修改註釋)(縮寫:e)

squash:將該commit和前一個commit合併(縮寫:s)

fixup:將該commit和前一個commit合併,但不要保留該提交的註釋資訊(縮寫:f)

drop:丟棄該commit(縮寫:d)

exec:這個比較特殊,可以新增一行單獨寫。執行shell命令(exec之後的部分)(縮寫:x)

注: 完整命令是 git rebase -i [startpoint] [endpoint] ——> 修改區間內的提交,區間前開後閉。

5。遠端同步

命令列操作

git pull ——> 拉取程式碼等同於git fetch和git merge。

git pull ——rebase ——> 拉取程式碼等同於git fetch和git rebase。

注:實際上git pull的真正命令形式是這樣的:

git pull :

只不過我們在當前分支從預設遠端主機拉取程式碼的時候,忽略了後面的引數

git push 本地分支推送到遠端倉庫的對應分支。

git push -f ——> 強行推送,即時有衝突也會被覆蓋。

注:同git pull一樣,實際上git push的真正命令形式是這樣的:

git push :

參考:

https://git-scm。com/book/zh/v2/Git-工具-高階合併

https://www。runoob。com/git/git-tutorial。html

https://github。com/alibaba/fastjson/issues/2346

頂部