git學習筆記

安河桥北i發表於2024-04-18

基礎命令

  1. git init 把目錄變成Git可以管理的倉庫。
  2. git add 把檔案新增到倉庫。
  3. git commit 把檔案提交到倉庫
  4. git commit -m "這裡是檔案提交說明" 新增提交說明,方便查閱。
  5. git status 檢視追蹤的目錄檔案哪些做了修改。
  6. git stage 檢視倉庫當前狀態。
  7. git diff 檢視上次修改內容。
  8. git log 檢視歷史修改記錄。 git log --pretty=online 只看提交說明

時光穿梭

  1. git reset --hard HEAD^ 回到上一個版本。
  2. git reset --hard 321ef1 回到版本為 321ef1到狀態,版本號沒必要寫全,前幾位就可以,Git會自動去找。
  3. git reflog 檢視歷史穿梭版本。
  4. git checkout -- file 丟棄工作區的修改。(git checkout其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。)

HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。 穿梭前,用git log可以檢視提交歷史,以便確定要回退到哪個版本。 要重返未來,用git reflog檢視命令歷史,以便確定要回到未來的哪個版本。

工作區和暫存區

工作區(Working Directory) 顧名思義就是當前工作的目錄。

版本庫(Repository) 工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。 Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD

git add命令將檔案新增到暫存區。 git commit命令將所有暫存區內容提交到當前分支。

Workflow
因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

其實就是將需要提交的檔案修改通通放到暫存區,然後一次性提交暫存區的所有修改。

遠端倉庫

1.建立SSH Key

$ ssh-keygen -t rsa -C "youremail@example.com"
複製程式碼

2.關聯遠端倉庫

$ git remote add origin git@github.com:blacker/learngit.git
複製程式碼

blacker為關聯的github賬戶名,learngit為倉庫名

3.推送到遠端庫

git push -u origin master
複製程式碼

git push命令是把本地當前分支masrer推送到遠端庫。 如果遠端庫是空的,第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送的遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以使用簡化命令。

git push origin master
複製程式碼

錯誤處理

To github.com:hellowqw/leargit
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:hellowqw/leargit'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
複製程式碼

出現錯誤的主要原因是github中的README.md檔案不在原生程式碼目錄中 解決 可以通過如下命令進行程式碼合併【注:pull=fetch+merge]

git pull --rebase origin master
複製程式碼

執行上面程式碼後可以看到原生程式碼庫中多了README.md檔案

分支

建立倉庫時預設只有一個分支,即主分支masterHEAD嚴格來說不是指向提交,而是指向mastermaster才是指向提交的。 最初,master分支是一條線,Git用master指向最新的提交,在用HEAD指向master,就能確定當前分支,以及當前分支的提交點:

git學習筆記
每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長。 當建立新的分支,例如dev時,Git新建了一個指標叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:

git checkout -b dev 
複製程式碼

-b參數列示建立並切換分支,相當於以下兩條命令:

git branch dev
git checkout dev
複製程式碼

git branch命令檢視當前分支:

git branch
   * dev
   master
複製程式碼

git學習筆記
Git建立一個分支很快,因為除了增加一個dev指標,改變HEAD的指向,工作區的檔案都沒有任何變化!

不過,從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次後,dev指標往前移動一步,而master指標不變:

git學習筆記

假如在dev上的工作完成了,就可以把dev合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併。 切換master分支:

git checkout master
複製程式碼

此時狀態:

git學習筆記
現在,把dev分支的工作成果合併到master分支上:

git merge dev
Updating d17efd8..fec145a
Fast-forward   #快進模式也就是直接把master指向dev的當前提交,所以合併速度非常快。
 readme.txt |    1 +
 1 file changed, 1 insertion(+)
複製程式碼

git merge命令用於合併指定分支到當前分支。

git學習筆記
所以Git合併分支也很快!就改改指標,工作區內容也不變!

合併完分支後,甚至可以刪除dev分支。

git branch -d dev
複製程式碼

刪除dev分支就是把dev指標給刪掉,刪掉後,就剩下了一條master分支。

git branch
  * master
複製程式碼

因為建立、合併和刪除分支非常快,所以Git鼓勵我們使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。 #####小結 檢視分支:git branch 建立分支:git branch 切換分支:git checkout 建立+切換分支:git checkout -b 合併某分支到當前分支:git merge 刪除分支:git branch -d #分支管理策略 在實際開發中,我們應該按照幾個基本原則進行分支管理:

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

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

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

所以,團隊合作的分支看起來就像這樣:

git學習筆記

令,上面有提到合併分支時又一個Fast forward模式,需要注意到是這種模式下,刪除分支後,會丟掉分支資訊。 如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支資訊。

git merge --no-ff -m "merge with no-ff" dev
複製程式碼

相關文章