Git基本操作教程

git
git

什么是Git?

Git是一款免費、開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目。


創建版本庫

版本庫又名倉庫,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

怎么做

  • 初始化一個Git倉庫,使用git init命令。
  • 添加文件到Git倉庫,分兩步:
    • 使用命令git add <file>,可反復多次使用,添加多個文件
    • 使用命令git commit,完成。

時光穿梭機

  • 使用git status命令,隨時掌握工作區的狀態。
  • 如果如果git status告訴你有文件被修改過,用git diff可以查看修改內容。

版本回退

  • 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到暫存區,那就不會加入到commit中。

撤銷修改

  • 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
  • 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
  • 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

刪除文件

一般情況下,你通常直接在文件管理器中把沒用的文件刪了,或者用rm命令刪了
這個時候,Git知道你刪除了文件,因此,工作區和版本庫就不一致了,git status命令會立刻告訴你哪些文件被刪除了;
現在你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,并且git commit
現在,文件就從版本庫中被刪除了。
另一種情況是刪錯了,因為版本庫里還有呢,所以可以很輕松地用git checkout把誤刪的文件恢復到最新版本,git checkout其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
命令git rm用于刪除一個文件。如果一個文件已經被提交到版本庫,那么你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交后你修改的內容


遠程倉庫

自行注冊GitHub賬號。由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,所以,需要一點設置:

  • 第1步:創建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub。
    這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:
    $ ssh-keygen -t rsa -C "youremail@example.com"
    你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認值即可,由于這個Key也不是用于軍事目的,所以也無需設置密碼。
    如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsaid_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
  • 第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面:
    然后,點“Add SSH Key”,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內容:


    github-addkey-1

    點“Add Key”,你就應該看到已經添加的Key:


    github-addkey-2

添加遠程庫

  • 要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git
  • 關聯后,使用命令git push -u origin master第一次推送master分支的所有內容;
  • 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
  • 分布式版本系統的最大好處之一是在本地工作完全不需要考慮遠程庫的存在,也就是有沒有聯網都可以正常工作,而SVN在沒有聯網的時候是拒絕干活的!當有網絡的時候,再把本地提交推送一下就完成了同步。

從遠程庫克隆

  • 要克隆一個倉庫,首先必須知道倉庫的地址,然后使用git clone命令克隆。
  • Git支持多種協議,包括https,但通過ssh支持的原生git協議速度最快。

分支管理

Git的分支是與眾不同的,無論創建、切換和刪除分支,Git在1秒鐘之內就能完成!無論你的版本庫是1個文件還是1萬個文件。

創建與合并分支

Git鼓勵大量使用分支:
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合并某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>

解決沖突

當Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。用git log --graph命令可以看到分支合并圖。

分支管理

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

  • 首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;
  • 那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合并到master上,在master分支發布1.0版本;
  • 你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。
  • 所以,團隊合作的分支看起來就像這樣:


    git-br-policy
小結
  • Git分支十分強大,在團隊開發中應該充分應用。
  • 合并分支時,加上--no-ff參數就可以用普通模式合并,合并后的歷史有分支,能看出來曾經做過合并,而fast forward合并就看不出來曾經做過合并。

Bug分支

  • 修復bug時,我們會通過創建新的bug分支進行修復,然后合并,最后刪除;
  • 當手頭工作沒有完成時,先把工作現場git stash一下,然后去修復bug,修復后,再git stash pop,回到工作現場。

Feature分支

  • 開發一個新feature,最好新建一個分支;
  • 如果要丟棄一個沒有被合并過的分支,可以通過git branch -D <name>強行刪除。

多人協作

  • 查看遠程庫信息,使用git remote -v
  • 本地新建的分支如果不推送到遠程,對其他人就是不可見的;
  • 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
  • 在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
  • 建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name
  • 從遠程抓取分支,使用git pull,如果有沖突,要先處理沖突。

標簽管理

發布一個版本時,我們通常先在版本庫中打一個標簽(tag),這樣,就唯一確定了打標簽時刻的版本。將來無論什么時候,取某個標簽的版本,就是把那個打標簽的時刻的歷史版本取出來。所以,標簽也是版本庫的一個快照。

創建標簽

  • 命令git tag <name>用于新建一個標簽,默認為HEAD,也可以指定一個commit id;
  • git tag -a <tagname> -m "blablabla..."可以指定標簽信息;
  • git tag -s <tagname> -m "blablabla..."可以用PGP簽名標簽;
  • 命令git tag可以查看所有標簽。

操作標簽

  • 命令git push origin <tagname>可以推送一個本地標簽;
  • 命令git push origin --tags可以推送全部未推送過的本地標簽;
  • 命令git tag -d <tagname>可以刪除一個本地標簽;
  • 命令git push origin :refs/tags/<tagname>可以刪除一個遠程標簽。

使用GitHub

  • 在GitHub上,可以任意Fork開源倉庫;
  • 自己擁有Fork后的倉庫的讀寫權限;
  • 可以推送pull request給官方倉庫來貢獻代碼。

此教程基源于廖雪峰的官方網站Git教程

其他好的Git學習網站

  1. 猴子都能懂得Git入門
  2. Git遠程操作詳解——阮一峰
  3. Git基本操作|菜鳥教程

寶劍鋒從磨礪出,梅花香自苦寒來。加油吧,繼續向前。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容