必知的git基本命令及常見問題

程式碼詩人_發表於2023-01-16

<h2>基本的拉取上傳檔案命令</h2>

0.git pull先更新檔案/git pull origin dev; git status  檢視檔案的增刪改狀態
1.git clone 線上庫存地址;   git clone -b  dev(遠端分支)  連結
2.git add 要提交的檔案或者資料夾    或者git add .(表示提交所有修改過的檔案,新增到暫存區)

注:git add 只將新建的或者已更改的檔案新增到索引區。(不會新增刪除的檔案)
3.git commit -m '備註';提交到暫存區  -m(預設為master分支) / 跳過檢查提交:git commit --no-verify commit -m '註釋'
3.git push ;正式提交
4.git log  檢視提交的日誌 或者git log --pretty=oneline 更加清楚明瞭的檢視

5.  關聯遠端分支:
   (1) git branch --v 檢視關聯關係
   (2) 關聯遠端分支:git branch --set-upstream-to=origin/遠端分支的名字 本地分支的名字         
ps:關聯遠端庫後,使用命令git push -u origin master第一次推送master分支的所有內容;
或者:git checkout -b 本地分支名字 origin/遠端分支名字  建立本地分支並自動關聯遠端分支

此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改;

Git是跟蹤修改的,每次修改,如果不用git add到暫存區,那就不會加入到commit中。

用git diff HEAD -- qq.html命令可以檢視工作區和版本庫裡面最新版本的區別
<h2>常用基本命令</h2>

1. git diff 提交檔案之前可用此命令檢視檔案被修改了哪些
2. git log  上傳檔案後  可檢視提交的歷史資訊 
        git log --pretty=oneline --abbrev-commit 找到歷史提交的commit id
        git log --graph 檢視到分支合併圖。或者git log --graph --pretty=oneline --abbrev-commit
        
3. git reset --hard HEAD^ 回退到上一個版本
    --hard
4. git reset --hard 09BH(歷史版本16進位制的前四位即可,git自動找)   回到指定版本
    如果關閉了git視窗  可使用git reflog命令檢視之間提交的版本
    git rebase --onto cbe8527^ cbe8527 刪除某次提交
5.cat op.html 或者git show 檢視檔案內容
5. git checkout -- qq.html  或者 git restore op.html  把qq.html檔案在工作區的修改全部撤銷,這裡有兩種情況:
    (1)一種是 qq.html自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
    (2)一種是 qq.htmlt已經新增到暫存區後,又作了修改,現在,撤銷修改就回到新增到暫存區後的狀態。
6. git diff HEAD -- qq.html   檢視工作區和版本庫裡面最新版本的區別
7. git reset HEAD <file> 可以把暫存區的修改撤銷掉),重新放回工作區,

      git reset HEAD -- . 撤銷所有
     git reset HEAD -- filename 撤銷特定目標
      git rm -cached filepath 將檔案從快取中刪除

8.git reflog 檢視命令歷史,以便確定要回到未來的哪個版本。
9. git rm qq.html  刪除檔案     git rm -r css/  刪除資料夾
10.git remote 檢視遠端庫的資訊 或用git remote -v顯示更詳細的資訊  

11.git push origin dev(分支名稱)  推送對應分支
但是,並不是一定要把本地分支往遠端推送,那麼,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要時刻與遠端同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠端同步;
bug分支只用於在本地修復bug,就沒必要推到遠端了,除非老闆要看看你每週到底修復了幾個bug;
feature分支是否推到遠端,取決於你是否和你的小夥伴合作在上面開發。
12. git tag v1.0(版本號) 為專案打版本號(標籤)
    git push origin --tags 推送全部尚未推送到遠端的本地標籤
    git tag -d v0.9 刪除標籤  先從本地刪除  然後git push origin :refs/tags/v0.(刪除一個遠端標籤)
    
    命令git tag <tagname>用於新建一個標籤,預設為HEAD,也可以指定一個commit id;
    命令git tag -a <tagname> -m "blablabla..."可以指定標籤資訊;
    命令git tag可以檢視所有標籤
    
    13.git commit --amend 修改最後一次提交的註釋
    https://www.jianshu.com/p/098d85a58bf1

<h2>分支及基本處理</h2>

1. git checkout -b dev 建立dev分支,然後切換到dev分支  或者 git switch  -b dev
    -b參數列示建立並切換
            相當於這兩條命令:
             git branch dev
             git checkout dev
 2. git branch  檢視當前分支;    檢視已有的本地及遠端分支: git branch -a
 3. git merge dev  將子分支合併到主分支master,合併後,檢視主分支,和子分支內容一樣
   Fast-forward資訊,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。
   
 總結:
Git鼓勵大量使用分支:

檢視分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>或者git switch <name>
建立+切換分支:git checkout -b <name>或者git switch -c <name>
拉去遠端分支:git fetch origin dev(dev為遠端倉庫的分支名)
合併某分支到當前分支:git merge <name>
刪除本地分支:git branch -d <name>; 刪除遠端分支:git push origin --delete dev

<h2>處理常見問題</h2>
1.本地git rm file 後遠端倉庫還有該檔案?

$ git add -u 只會處理已修改或者已刪除的檔案,但是不會處理新建的檔案

$ git commit -m "delete test"

$ git push

2.處理常見合併分支衝突

圖上意思:
編碼qe.html

衝突(內容):在q .html中合併衝突

自動合併失敗;修復衝突,然後提交結果。

Git告訴我們,qe.html檔案存在衝突,必須手動解決衝突後再提交。git status也可以告訴我們衝突的檔案;

(1)git log --graph --pretty=oneline --abbrev-commit 看到分支的合併情況

(2)把Git合併失敗的檔案手動編輯為我們希望的內容,再提交。

(3)刪除feature1分支

3.git add 等不能操作檔案?

4.Git操作的過程中突然顯示:

Another git process semms to be running in this repository, e.g. an editor opened by ‘git commit’. Please make sure all processes are terminated then try again. If it still fails, a git process remove the file manually to continue…

翻譯過來就是git被另外一個程式佔用,重啟機器也不能夠解決。
原因在於Git在使用過程中遭遇了奔潰,部分被上鎖資源沒有被釋放導致的。

解決方案:進入專案資料夾下的 .git檔案中(顯示隱藏資料夾或rm .git/index.lock)刪除index.lock檔案即可。

  1. git commit 時 報錯處理
    提示:

    husky > pre-commit (node v12.18.3)
    ‼ Some of your tasks use `git add` command. Please remove it from the config since all modifications made by tasks will be automatically added to the git commit index.

解決:刪除或重新命名 .git > hooks > pre-commit 檔案即可
進入hooks資料夾,並找到pre-commit檔案,這就是commit失敗的根源所在了。
該檔案所起到的作用是:
pre-commit(客戶端)鉤子,它會在Git鍵入提交資訊前執行做程式碼風格檢查。
如果程式碼不符合相應規則,則報錯。
我們將該檔案刪除之後,再進行commit,發現就能成功提交了。

  1. git merge 分支 出現 warning: could not open directory ‘xxx‘: Permission denied...
    解決:這種錯誤說明無許可權操作檔案,關閉掉編輯器及程式碼執行器即可

<h2>分支管理策略</h2>

通常,合併分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支資訊。

如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支資訊。

下面展示一下--no-ff方式的git merge:

 1.建立並切換分支
    git switch -c dev
 2. 修改檔案並提交一個新的commit
    git add qe.html
    git commit -m 'change qe.html'
  3.切換回master主分支
    git switch master
  4. 準備合併dev分支,請注意--no-ff引數,表示禁用Fast forward:
      $ git merge --no-ff -m "merge with no-ff" dev 這種合併方法會在master分支上新建一個提交節點,從而完成合並
      
  5.  因為本次合併要建立一個新的commit,所以加上-m引數,把commit描述     寫進去。
      合併後,我們用git log看看分支歷史:
      $ git log --graph --pretty=oneline --abbrev-commit
    

分支策略
在實際開發中,我們應該按照幾個基本原則進行分支管理:

首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;

那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本釋出時,再把dev分支合併到master上,在master分支釋出1.0版本;

你和你的小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合併就可以了。

合併分支時,加上--no-ff引數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。

<h2>Bug分支</h2>
團隊協作中,bug是連綿不斷的,所以,每個bug都可以透過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。

如果現在有個bug,我們來操作下:。

1.git stash  先把你當前分支的內容存貯起來,等以後恢復現場後繼續工作;
2.git switch master 切換到主分支,準備建立一個bug分支(issue-101);
3.git switch -c issue-101  建立一個bug分支(issue-101);
4.  git add qe.html
    git commit -m "fix bug 101"  修改bug並提交
5.修復完成後,切換到master分支,並完成合並,最後刪除issue-101分支:
  git switch master;
  git merge --no-ff -m "merged bug fix 101" issue-101
  git branch -d issue-101
  
 6.bug已修復,現在,是時候接著回到dev分支幹活 
    git switch dev
    git stash list 檢視之前存貯的內容:
    stash@{0}: WIP on dev: f52c633 add merge
 7. 現在需要恢復一下存貯的內容,恢復有2種方法:
    (1)用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除
    (2)用git stash pop,恢復的同時把stash內容也刪了
    再用git stash list檢視,就看不到任何stash內容了
    你可以多次stash,恢復的時候,先用git stash list檢視,然後恢復指定的stash,用命令:
    git stash apply stash@{0}
    
8. 在master分支上修復了bug後,我們要想一想,dev分支是早期從master分支分出來的,所以,這個bug其實在當前dev分支上也存在。

那怎麼在dev分支上修復同樣的bug?重複操作一次,提交不就行了?
 

同樣的bug,要在dev上修復,我們只需要把4c805e2 fix bug 101這個提交所做的修改“複製”到dev分支。
注意:我們只想複製4c805e2 fix bug 101這個提交所做的修改,並不是把整個master分支merge過來。

為了方便操作,Git專門提供了一個cherry-pick命令,讓我們能複製一個特定的提交到當前分支:
    git branch
* dev
  master
$ git cherry-pick 4c805e2
[master 1d4b803] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)
 

Git自動給dev分支做了一次提交,注意這次提交的commit是1d4b803,它並不同於master的4c805e2,因為這兩個commit只是改動相同,但確實是兩個不同的commit。用git cherry-pick,我們就不需要在dev分支上手動再把修bug的過程重複一遍。

總結:
修復bug時,我們會透過建立新的bug分支進行修復,然後合併,最後刪除;

當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場;

在master分支上修復的bug,想要合併到當前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“複製”到當前分支,避免重複勞動。
<h2>Feature分支</h2>

新增一個新功能時,我們為了不打亂主分支master,所以在我們當前分支上(dev)新建分支

1. git switch -c feature-1  新建分支寫功能
2.git add <file>
3.git commit -m 'feature-1'
4.切回dev,準備合併
  git switch dev
  合併時如果該功能不適用,需要刪除,怎麼操作?
  如下:
   git branch -d feature-1
   報錯:error: The branch 'feature-1' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
銷燬失敗。Git友情提醒,feature-1分支還沒有被合併,如果刪除,將丟失掉修改,如果要強行刪除,需要使用大寫的-D引數。。

現在我們強行刪除:
git branch -D feature-1  即可成功

<h2>團隊協作</h2>
1.抓取分支:
參考 https://www.liaoxuefeng.com/w...

相關文章