Git 常用操作彙總-cheat sheet

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"0. 前言"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"大家好,我是多選參數的程序鍋,一個正在 neng 操作系統、學數據結構和算法以及 Java 的硬核菜雞。到今天爲止,關於 Git 的大坑算是給填上了。但是 Git 這個系列並不會結束,程序鍋偶爾看到比較好的關於 Git 的文章也會整理一番發出來,爭取在 Git 的坑上再長棵樹。"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/86/8674175f513566dce863d7b5e7b7d4cb.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"1. 常用命令"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.1. git 配置"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"# 顯示 config 的配置 加--list\n# 優先級:local > global > system\ngit config --list --local # local 的範圍是某個倉庫\ngit config --list --global # global 的範圍是登錄的用戶\ngit config --list --system # system 的範圍是系統所有登錄的用戶\n\n# 配置用戶 name 和 email\ngit config --global user.name 'your_name '\ngit config --global user.email '[email protected]'\n\n# 清除配置信息\ngit config --unset --global user.name"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.2. 倉庫初始化"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"# 將執行該命令時所在的目錄初始化爲一個 git 倉庫(如:進入某目錄後執行該命令會將該目錄初始化爲一個 git 倉庫)\ngit init\n\n# 會在當前路徑下創建和項目名稱同名的文件夾,並將其初始化爲 git 倉庫\ngit init your_project"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.3. git add"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git add readme.md # 將 readme.md 文件添加到暫存區\ngit add . # 將當前工作目錄的所有文件添加到暫存區\ngit add -u # 把修改之後的文件(這些文件已經被管理起來了)一次性提交到暫存區"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.4. git status"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git status # 查看工作目錄和暫存區的狀態"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.5. git commit"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git commit -m 'Add readme.md' # -m 指定 commit 的信息\ngit commit # 這時候會跳出一個文本輸入界面,讓你輸入更多的 commit 信息"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.6. git mv"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git mv readme readme.md # 將 git 管理的文件進行重命名"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.7. git rm"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git rm filename # 從 git 管理的文件刪除某個已管理的文件,同時把修改的情況添加到暫存區"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.8. git log"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git log # 只查看當前分支(Head所指的分支)的log情況\ngit log --oneline # 簡潔的顯示版本更新信息\ngit log -n2 # n2 代表查看最近兩次commit歷史\ngit log -2 # 2 代表查看最近兩次commit歷史\ngit log -n2 --oneline # 簡潔的顯示最近兩次的版本更新信息\ngit log branch_name # 後面跟上分支名錶示查看該分支的log日誌\n\ngit log -all # 列出所有分支的log\ngit log --all --graph # 以圖形化的方式查看\ngit log --oneline --all # 以簡潔的方式查看所有分支的log\ngit log --oneline --all -n4# 以簡潔的方式查看所有分支的log\n\ngit help log # 以web的方式查看log的幫助文檔,等同於\ngit help --web log # 和上面那條效果一樣"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2. 分支相關"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git branch -v # 查看本地分支的詳細情況\ngit branch -a # 查看所有分支,包括遠端分支,但沒有過於詳細的信息\ngit branch -av # 查看所有分支情況\n\ngit branch branch_name hash_value # 創建一個新的分支,基於 hash_value 的這個 commit 創建一個新的分支,hash_value 可以省略,那麼默認是基於當前分支的最後一個 commit 創建。\n\ngit branch -d branch_name\ngit branch -D branch_name # 這個分支已經有了一些 commit\n\ngit checkout branch_name # 切換分支\ngit checkout master\n\ngit checkout -b branch_name git_id # 創建一個新的分支並切換過去,git_id可以是hash_value,也可以是某個分支的名字(分支的名字其實就指向了某個 commit)\ngit checkout -b temp 9ef147d\ngit checkout -b temp2 master\n\ngit checkout hash_value # 分離頭指針"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"3. 比較"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git diff hash_value1 hash_value2 # hash_value1 對應的 comimit 和 hash_value2 對應的 commit 進行比較\n\ngit diff hash_value1 hash_value2 -- file_name1 file_name2 # 在上述基礎之上,只比較 file_name1、file_name2 這兩個文件\n\ngit diff branch_name1 branch_name2 # 對兩個分支進行比較,也可以跟 -- 只看某些文件\n\ngit diff HEAD HEAD^ # HEAD 指向的 commit 與該 commit 的父親 commit 進行比較\ngit diff HEAD HEAD^^ # HEAD 指向的 commit 與該 commit 的父親的父親 commit 進行比較\n\ngit diff HEAD HEAD~ # HEAD 指向的 commit 與該 commit 的父親 commit 進行比較\ngit diff HEAD HEAD~1 # 同上 \ngit diff HEAD HEAD~2 # HEAD 指向的 commit 與該 commit 的父親的父親 commit 進行比較\n\ngit diff --cached # 暫存區和 HEAD 做比較,也可以跟 -- 只看某些文件\n\ngit diff # 工作目錄和暫存區中所有文件進行比較,也可以跟 -- 只看某些文件"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"4. 版本歷史更改"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git commit --amend # 最近一次 commit 的 message 修改\n\ngit rebase -i hash_value # 交互文件中選擇 reword,老舊 commit 的 message 修改。hash_value,是需要的 commit 的父親 commit 的 hash_value\n\ngit rabase -i hash_value # 交互文件中選擇 squash,多個連續 commit 合併成一個,hash_value 同上\n\ngit rebase -i hash_value # 交互文件中選擇 squash,把間隔的 commit 移到一塊,即可合併成一個,hash_value\n\ngit rebase origin/master # 把當前分支基於 origin/master 做 rebase 操作,也就相當於把當前分支的東西加到 origin/master 中"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"5. 回滾操作"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git reset HEAD # 暫存區恢復成和 HEAD 一樣\ngit reset HEAD -- file_name1 file_name2 # 暫存區部分文件變得跟 HEAD 一樣\n\ngit checkout -- file_name # 工作目錄指定文件恢復爲和暫存區一樣\ngit checkout -- *|. ## 工作目錄全部文件恢復爲和暫存區一樣\n\ngit reset --hard hash_value # 把 HEAD、暫存區、工作目錄都回滾到 hash_value 所代表的 commit 中。\ngit reset --hard # 把暫存區裏面的修改去掉,也就是讓暫存區、工作目錄默認恢復到 HEAD 的位置"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"6. 工作目錄、暫存區狀態保存"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git stash # 把相應的修改內容給存下來,之後 git status 查看的話又變爲什麼都沒改變的了\ngit stash list # 查看存下來的內容\ngit stash apply # 存下來的內容又恢復了,但是存下來的內容還在 stash 中\ngit stash pop # 存下來的內容恢復了,但是存下來的內容也沒了"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"7. 合併"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git merge branch_name1 branch_name2\ngit merge hash_value1 hash_value2\ngit merge --squash # 以 squash 方式進行 merge"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"8. Git 對象操作"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git cat-file -t|p|s hash_value # 顯示版本庫對象的內容,類型及大小信息\ngit cat-file -t hash_value # 查看版本庫對象的類型\ngit cat-file -p hash_value # 查看版本庫對象的內容\ngit cat-file -s hash_value # 查看版本庫對象的大小"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"9. Git 遠端操作"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"git remote add # 這邊遠端名的意思是遠端倉庫的別名,push、pull 都將用到遠端名\ngit remote -v # 查看遠端倉庫連接情況\ngit remote set-url 你新的遠程倉庫地址 # 修改遠端倉庫地址\ngit remote rm # 刪除遠端倉庫\n\ngit clone # 把遠端倉庫 clone 下來\ngit clone --bare # bare 是指不帶工作目錄,也就相當於只 clone .git 目錄\n\ngit push \ngit push -u # -u 表示將本地分支的內容推到遠端分支,並且將本地分支和遠端分支關聯起來\ngit push -u origin master # 表示把本地 master 分支的內容推到遠端分支 origin/master,並且將本地分支 master 和遠端分支 origin/master 關聯起來\ngit push # 這條命令也可以使用,默認是將當前本地所在分支推到相關聯的遠端分支\n\ngit fetch \ngit fetch origin master # 將遠端分支 origin/master fetch 到本地\n\ngit pull # 將遠端分支 fetch 到本地,並且將遠端分支和本地所處分支進行合併\ngit pull --rebase # 以 rebase 方式進行合併,也就是將本地分支 rebase 到遠端分支"}]},{"type":"heading","attrs":{"align":null,"level":2}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章