通過圖解的方式學習常用Git命令

2021-01-08 itworld123

本文通過圖解的方式介紹git 中的最常用命令。如果你稍微理解 git 的工作原理,這篇文章能夠讓你理解的更透徹。

基本用法

上面的四條命令在工作目錄、stage 緩存(也叫做索引)和 commit 歷史之間複製文件。

git add files 把工作目錄中的文件加入 stage 緩存git commit 把 stage 緩存生成一次 commit,並加入 commit 歷史git reset -- files 撤銷最後一次 git add files,你也可以用 git reset 撤銷所有 stage 緩存文件git checkout -- files 把文件從 stage 緩存複製到工作目錄,用來丟棄本地修改你可以用 git reset -p、git checkout -p 或 git add -p 進入交互模式,也可以跳過 stage 緩存直接從 commit歷史取出文件或者直接提交代碼。

git commit -a 相當於運行 git add 把所有當前目錄下的文件加入 stage 緩存再運行 git commit。git commit files 進行一次包含最後一次提交加上工作目錄中文件快照的提交,並且文件被添加到 stage 緩存。git checkout HEAD -- files 回滾到複製最後一次提交。約定

後文中以下面的形式使用圖片:

綠色的5位字符表示提交的 ID,分別指向父節點。分支用橙色顯示,分別指向特定的提交。當前分支由附在其上的 _HEAD_ 標識。

這張圖片裡顯示最後 5 次提交,_ed489_ 是最新提交。 _master_ 分支指向此次提交,另一個 _maint_ 分支指向祖父提交節點。

命令詳解

Diff

有許多種方法查看兩次提交之間的變動,下圖是其中一些例子。其中git diff b325c da985用於比較兩次提交間的差異。git diff maint表示當前工作空間與maint分支之間的差異。

Commit

提交時,Git 用 stage 緩存中的文件創建一個新的提交,並把此時的節點設為父節點。然後把當前分支指向新的提交節點。下圖中,當前分支是 _master_。

在運行命令之前,_master_ 指向 _ed489_,提交後,_master_ 指向新的節點_f0cec_ 並以 _ed489_ 作為父節點。

即便當前分支是某次提交的祖父節點,Git 會同樣操作。下圖中,在 _master_ 分支的祖父節點 _maint_ 分支進行一次提交,生成了 _1800b_。

這樣,_maint_ 分支就不再是 _master_ 分支的祖父節點。此時,merge 或者 rebase 是必須的。

如果想更改一次提交,使用 git commit --amend。Git 會使用與當前提交相同的父節點進行一次新提交,舊的提交會被取消。

另一個例子是分離HEAD提交,在後面的章節中介紹。

Checkout

git checkout 命令用於從歷史提交(或者 stage 緩存)中拷貝文件到工作目錄,也可用於切換分支。

當給定某個文件名(或者打開 -p 選項,或者文件名和-p選項同時打開)時,Git 會從指定的提交中拷貝文件到 stage 緩存和工作目錄。比如,git checkout HEAD~ foo.c 會將提交節點 _HEAD~_(即當前提交節點的父節點)中的 foo.c 複製到工作目錄並且加到 stage 緩存中。如果命令中沒有指定提交節點,則會從 stage 緩存中拷貝內容。注意當前分支不會發生變化。

當不指定文件名,而是給出一個(本地)分支時,那麼 _HEAD_ 標識會移動到那個分支(也就是說,我們「切換」到那個分支了),然後 stage 緩存和工作目錄中的內容會和 _HEAD_ 對應的提交節點一致。新提交節點(下圖中的 a47c3)中的所有文件都會被複製(到 stage 緩存和工作目錄中);只存在於老的提交節點(ed489)中的文件會被刪除;不屬於上述兩者的文件會被忽略,不受影響。

如果既沒有指定文件名,也沒有指定分支名,而是一個標籤、遠程分支、SHA-1 值或者是像 _master~3_ 類似的東西,就得到一個匿名分支,稱作 _detached HEAD_(被分離的 _HEAD_ 標識)。這樣可以很方便地在歷史版本之間互相切換。比如說你想要編譯 1.6.6.1 版本的 Git,你可以運行 git checkout v1.6.6.1(這是一個標籤,而非分支名),編譯,安裝,然後切換回另一個分支,比如說 git checkout master。然而,當提交操作涉及到「分離的 HEAD」時,其行為會略有不同,詳情見在下面。

HEAD 標識處於分離狀態時的提交操作

當 _HEAD_ 處於分離狀態(不依附於任一分支)時,提交操作可以正常進行,但是不會更新任何已命名的分支。你可以認為這是在更新一個匿名分支。

一旦此後你切換到別的分支,比如說 _master_,那麼這個提交節點(可能)再也不會被引用到,然後就會被丟棄掉了。注意這個命令之後就不會有東西引用 _2eecb_。

但是,如果你想保存這個狀態,可以用命令 git checkout -b name 來創建一個新的分支。

Reset

git reset 命令把當前分支指向另一個位置,並且有選擇的變動工作目錄和索引。也用來在從歷史commit歷史中複製文件到索引,而不動工作目錄。

如果不給選項,那麼當前分支指向到那個提交。如果用 --hard 選項,那麼工作目錄也更新,如果用 --soft 選項,那麼都不變。

如果沒有給出提交點的版本號,那麼默認用 _HEAD_。這樣,分支指向不變,但是索引會回滾到最後一次提交,如果用 --hard 選項,工作目錄也同樣。

如果給了文件名(或者 -p 選項), 那麼工作效果和帶文件名的checkout差不多,除了索引被更新。

Merge

git merge 命令把不同分支合併起來。合併前,索引必須和當前提交相同。如果另一個分支是當前提交的祖父節點,那麼合併命令將什麼也不做。

另一種情況是如果當前提交是另一個分支的祖父節點,就導致 _fast-forward_ 合併。指向只是簡單的移動,並生成一個新的提交。

否則就是一次真正的合併。默認把當前提交(_ed489_ 如下所示)和另一個提交(_33104_)以及他們的共同祖父節點(_b325c_)進行一次三方合併。結果是先保存當前目錄和索引,然後和父節點 _33104_ 一起做一次新提交。

Cherry Pick

git cherry-pick 命令「複製」一個提交節點並在當前分支做一次完全一樣的新提交。

Rebase

git rebase 是合併命令的另一種選擇。合併把兩個父分支合併進行一次提交,提交歷史不是線性的。rebase 在當前分支上重演另一個分支的歷史,提交歷史是線性的。

本質上,這是線性化的自動的 cherry-pick。

上面的命令都在 _topic_ 分支中進行,而不是 _master_ 分支,在 _master_ 分支上重演,並且把分支指向新的節點。注意舊提交沒有被引用,將被回收。

要限制回滾範圍,使用 --onto 選項。下面的命令在 _master_ 分支上重演當前分支從 _169a6_ 以來的最近幾個提交,即 _2c33a_。

同樣有 git rebase --interactive 讓你更方便的完成一些複雜操作,比如丟棄、重排、修改、合併提交。

相關焦點

  • Git版本控制常用命令
    Git常用命令集git使用命令1、查看git配置信息git config --list2、查看git用戶名git config user.name3、查看郵箱配置git config user.email4、全局配置用戶名git config --global user.name "nameVal"5、全局配置郵箱git config --global user.email
  • Git 常用命令及使用
    Git 常用命令使用1)、本地庫初始化 git init2)、設置籤名作用:區分不同開發人員的身份。說明:這裡設置的籤名和登錄遠程庫(代碼託管中心)的帳戶沒有關係。a)、項目級別籤名:git config user.name [AAA]git config user.email [郵箱地址]籤名信息位置:cat .git/configb)、系統級別籤名:git config --globaluser.name [AAA]git config --global user.email
  • git在項目中的常用命令
    其中.git文件夾中包含了兩個部分,一個是暫存區(Index或者Stage),顧名思義就是暫時存放文件的地方,通常使用add命令將工作區的文件添加到暫存區裡;本地倉庫:.git文件夾裡還包括git自動創建的master分支,並且將HEAD指針指向master分支。
  • git在項目中的常用命令
    其中.git文件夾中包含了兩個部分,一個是暫存區(Index或者Stage),顧名思義就是暫時存放文件的地方,通常使用add命令將工作區的文件添加到暫存區裡;本地倉庫:.git文件夾裡還包括git自動創建的master分支,並且將HEAD指針指向master分支。
  • 常用Git 命令清單
    我每天使用 Git ,但是很多命令記不住。 一般來說,日常使用只要記住下圖 6 個命令,就可以了。但是熟練使用,恐怕要記住 60~100 個命令。 下面是我整理的常用 Git 命令清單。幾個專用名詞的譯名如下。
  • 記不住Git那麼命令?動圖展示10個Git常用命令,建議收藏
    Git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道這些 git 命令執行的究竟是什麼任務嗎?如果你還有些分不清楚,那千萬不能錯過這篇文章。
  • git常用命令總結
    的管理當中,需要用git add file_name把它納入管理被追蹤(tracked):指該文件已經在git的管理中二、git常用命令2.1.初始化配置可以cd到一個目錄下,初始化git項目 git add file_name 修改工作目錄和暫存區的文件名稱
  • 程式設計師值得收藏的Git常用命令與操作,這篇足夠了!
    有的人可能還在用SVN,但是在這裡建議你使用Git,它們的區別是Git是分布式而SVN不是,Git把內容按元數據方式存儲的,然後SVN是按文件的。初始倉庫常用命令1,git init:Git是使用git init命令來初始化一個Git倉庫的,安裝完Git時第一個使用命令就是Git init命令。
  • Git命令的動畫展示,讓我們學習Git事半功倍
    前不久,哥倫比亞的一位小姐姐寫了一篇這樣的文章《CS Visualized: Useful Git Commands》,文章裡她通過生動形象的動畫這樣直觀的方式,向開發者展示 Git 命令中的 merge、rebase、reset、revert、cherry-pick 等常用命令的具體原理。下面我們一起看看吧。
  • git常用命令整理
    git init 初始化一個倉庫git status 查看狀態git add .將所有修改的文件添加到Stage區git commit -m "comment"把暫存區所有修改提交到分支git diff <name> 查看文件的修改git log --pretty=online 查看當前提交的日誌git reset --hard HEAD^ 回退到上一個版本git reset
  • git進階命令
    對git很多人只知道clone、pull、push,作為強大的命令行工具,git有很多方便易用的命令行,這篇主要收集git命令使用的一些常用小技巧。把當前修改添加到臨時堆棧中,並可以通過save命名:$ git stash save &34;Saved working directory and index state On master: fix test fieldHEAD is now at 454104b Initial commit
  • 不會 git 命令沒關係!通過 pycharm 玩轉 git
    今天分享的是在pycharm中如何使用git去github上拉取和提交代碼。git這個工具相信大家都聽說過,只不過很多小夥伴不會git的命令或者命令記得不太清楚,並沒有熟練掌握這個工具的使用。那麼今天在這個給大家分享一個不用命令來操作git的方法,就是通過我們python的IED工具pycharm來操作git(註:主要面向正在使用python的小夥伴),接下來直接進入主題!
  • 程式設計師常用的git/svn版本控制工具命令
    1、git拉取代碼:git clone git://github.com/schacon/grit.git #從伺服器上將代碼給拉下來gitbranch #查看當前分支git pull #同步更新代碼到本地提交修改代碼:git add path/文件名 (path路徑)git status #查看本地文件信息git commit -m "備註信息" #提交代碼到分支git push # 提交代碼到當前分支刪除本地代碼:
  • git常用命令大全
    一、分支操作1、創建分支git branch [分支名] # 例如:git branch develop2、查看分支git branch -v3、切換分支git checkout [分支名] #例如:git checkout develop4、合併分支① 切換到要合併的分支是上,例如主幹分支master git checkout [分支名] #例如:git checkout master② 執行merge git merge [分支名] #例如:git
  • 20 個最常用的 Git 命令用法說明及示例
    git init用法:git init [repository name]該命令可用於創建一個新的代碼庫。git clone用法:git clone [url]該命令可用於通過指定的URL獲取一個代碼庫。
  • Git常用命令總結及其用法說明
    以下是小編在工作中總結的關於git命令的一些使用方法,僅供參考。1、gitignore規則不生效.gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore是無效的。
  • Python 命令行之旅:使用 docopt 實現 git 命令
    按照慣例,我們要像使用 argparse 一樣使用 docopt 來實現 git 命令。為了讓沒讀過 使用 argparse 實現 git 命令 的小夥伴也能讀明白本文,我們仍會對 git 常用命令和 gitpython 做一個簡單介紹。本系列文章默認使用 Python 3 作為解釋器進行講解。
  • 這7個常用Git命令或概念你都知道嗎?
    全文共1667字,預計學習時長5分鐘以「; 」(分號)分隔的多個git命令以分號分隔可使用多個Git命令:$ git --version; git branch // separated by semi-colon
  • git 命令初探二
    git 的學習必須要明白分布式管理的模式,如上圖需要牢記,這樣你操作起來更加得心應手說明:workspace:工作區staging area:暫存區/緩存區local repository:或本地倉庫remote repository:遠程倉庫明白上面的圖例後我們緊接著學習git的分支管理,這是一個很輕大的版本控制,很多優點,可以自行百度一查
  • 這7個常用Git命令或概念你都知道嗎?
    圖源:hostinger1.以「; 」(分號)分隔的多個git命令以分號分隔可使用多個Git命令:$ git --version; git branch // separated by semi-colon2.git別名命令命令別名能提高可重用性。