這篇筆記是為了學習Git知識而收集總結的,主要是看受一篇帖子《你可能不知道的15條Git命令》的影響,才想記錄這篇筆記的,如有雷同,純屬巧合。
Git?是一個分布式版本控制軟件, 最初目的是為更好地管理Linux內核開發(fā)而設計。
來源:維基百科 - Git
Git是一個軟件,它允許你通過提交對一個系統(tǒng)(或一組)文件的歷史進行注釋。這些提交便是在給定時間點對系統(tǒng)做出的差異“快照”。
1.?Git?配置
--system #系統(tǒng)級別
--global #用戶全局
--local #單獨一個項目
git config --global user.name "xxxx" #用戶名
git config --global user.email "xxxx@xxx.com" #郵箱
git config --list # 列舉所有配置
? ? ? ? 1.創(chuàng)建SSH Key
????????ssh-keygen -t rsa -C <youremail@example.com>
? ? ? ? 2.登陸GitHub,打開Account settings?->?SSH Keys?->?Add SSH Key,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內容
? ? ? ? 3.測試是否連接????
? ??????ssh git@github.com
幾個概念:
工作區(qū)(Working Directory): 你在電腦里能看到的目錄。
暫存區(qū)(stage / index): 保存了下次將提交的文件列表信息, 一般存放在?.git目錄下 下的index文件(.git/index)中,所以我們把暫存區(qū)有時也叫作索引(index)。
版本庫(Repository): 工作區(qū)有一個隱藏目錄.git,這個不算工作區(qū),而是Git的版本庫。
遠程倉庫(Remote)
阮一峰老師對Git工作區(qū)、暫存區(qū)、版本庫、遠程倉庫的解釋
Runoob對Git工作區(qū)、暫存區(qū)、版本庫、遠程倉庫的解釋
忽略文件配置:添加.gitignore文件
文件?.gitignore?的格式規(guī)范如下:
? ? ? ? 1.所有空行或者以?#?開頭的行都會被 Git 忽略。
? ? ? ? 2.可以使用標準的 glob 模式匹配。
? ? ? ? 3.匹配模式可以以(/)開頭防止遞歸。
? ? ? ? 4.匹配模式可以以(/)結尾指定目錄。
? ? ? ? 5.要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。
2. 創(chuàng)建版本庫
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
git clone url # clone遠程倉庫
git init # 初始化本地版本庫
3.?Git?分支
master: 默認開發(fā)分支
HEAD: 當前開發(fā)分支
HEAD^([n]):?HEAD的第n次父提交提交,?^相當于^1
HEAD~([n]):?HEAD的第n個祖先提交
origin: 默認遠程版本庫
master:?master分支
*:?HEAD,當前活躍(開發(fā))分支
br1_c1:?br1分支的提交第一次提交
br1_c1_c1:?br1_c1的第一次提交
如何區(qū)分`^`和`~`?據(jù)上圖示知,當前開發(fā)分支是`master`,即`HEAD`指向`master`,`c1`,`c2`,`c3`是`master`的三次父提交`HEAD^ -> c1`,`HEAD^2 -> c2`,`HEAD^3 -> c3`,`HEAD~ -> c1`,`HEAD~2 -> c1_c1`
git branch # 查看分支
git branch -r #查看遠程分支?
git branch --contains?# 此命令將顯示包含特定提交的所有分支。
git branch # 創(chuàng)建分支
git checkout # 切換分支
git checkout -b # 創(chuàng)建 + 切換分支
git branch -m <old-name> <new-name>?# 重命名本地分支
git branch -m <new-name> # 重命名剛切換的新分支
# 重命名遠程分支: 一旦在本地重命名了分支,您需要先遠程刪除該分支,然后再次推送重命名的分支。
git push origin :<old-name>
git push origin <new-name>
git merge # 合并某分支到當前分支
git branch -d # 刪除分支
git branch -D # 強制刪除分支
# 刪除遠程分支(先在本地刪除該分支),原理是把一個空分支push到server上,相當于刪除該分支。
git push origin ::<name>
Note:?checkout只會移動HEAD指針,reset會改變HEAD的引用值
4. 查看
git status # 查看狀態(tài)
git diff <filename> # 查看修改內容
git diff <first_branch>..<second_branch> # 顯示兩次提交之間的差異
git diff --shortstat "@{n day ago}" # 顯示n天的代碼數(shù)量
git diff --cached(--staged) # 查看已經暫存起來的變化
git show <commit>:<filename> # 顯示某次提交時,某個文件的內容
git show <commit> # 顯示某次提交的元數(shù)據(jù)和內容變化
git show --name-only <commit> # 顯示某次提交發(fā)生變化的文件
git reflog # 顯示當前分支的最近幾次提交
git blame <filename> # 顯示指定文件修改信息
5. 修改
git add <filename>|<div> # 添加指定文件, 指定目錄(包括子目錄)到暫存區(qū)
git add . # 添加當前目錄的所有文件到暫存區(qū)
# -p(或-patch)允許交互選擇要提交的每個跟蹤文件的各個部分。 這樣每個提交只包含相關的更改。git add -p
git mv <old-name> <new-name> # 文件改名
git rm --cached <file> # 停止追蹤指定文件,但該文件會保留在工作區(qū)
git rm -f <filename> # 強制刪除選項 -f
6. 提交
git commit -m 'message' # 提交版本庫
git commit -a -m 'message' # 添加所有修改文件到暫存區(qū),并提交版本庫(不包括新增文件)
git commit --amend -m # 修改最后一次提交,如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
7. 撤銷、版本回滾?
git reset --hard HEAD # 撤銷工作目錄中暫存的所有未提交文件的修改內容
git reset --keep [commit] # 重置當前HEAD為指定commit,但保持暫存區(qū)和工作區(qū)不變
git reset [file] # 重置暫存區(qū)的指定文件,與上一次commit保持一致,但工作區(qū)不變
git commit --amend # 將暫存區(qū)中的文件提交
git checkout [file] # 恢復暫存區(qū)的指定文件到工作區(qū)
git checkout -p # --patch還可用于選擇性地丟棄每個被跟蹤文件的部分。
git checkout - ?# 此命令允許您快速切換到先前檢出的分支。 一般說來 - 是前一個分支的別名。 它也可以與其他命令一起使用。
git checkout . # 還原所有本地更改,如果您確定可以丟棄所有本地更改,則可以使用。
git checkout HEAD <filename> ?# 取消指定未提交文件的修改內容
git checkout --patch <filename> # 撤消對文件的修改
git revert <commit_id> # 撤銷指定提交
8. 提交歷史
常見參數(shù)選項:
-p: 顯示每次提交的內容差異。
—stat: 顯示每次更新的文件修改統(tǒng)計信息。
—shortstat: 只顯示?—stat?中最后的行數(shù)修改添加移除統(tǒng)計。
--name-only?僅在提交信息后顯示已修改的文件清單。
--name-status?顯示新增、修改、刪除的文件清單。
--abbrev-commit: 僅顯示?SHA-1?的前幾個字符,而非所有的 40 個字符。
--relative-date: 使用較短的相對時間顯示(比如,2 weeks ago)。
--graph: 顯示?ASCII?圖形表示的分支合并歷史。
—pretty=(oneline,short,medium(默認值),full,fuller,email,raw,format): 這個選項可以指定使用不同于默認格式的方式展示提交歷史。 這個選項有一些內建的子選項供你使用。
- `oneline`: 將每個提交放在一行顯示,查看的提交數(shù)很大時非常有用。- [`format`](https://git-scm.com/book/zh/v2/Git-基礎-查看提交歷史#rpretty_format): 列出了常用的格式占位符寫法及其代表的意義。
—oneline:?--pretty=oneline --abbrev-commit?的簡化用法。
--date= (relative|local|default|iso|rfc|short|raw):定制出現(xiàn)日期格式。
-n: 僅顯示最近的 n 條提交
—since,?—after: 僅顯示指定時間之后的提交
--until,?—before: 僅顯示指定作者相關的提交。
—author: 僅顯示指定提交者相關的提交。
—grep: 僅顯示含指定關鍵字的提交
-S: 僅顯示添加或移除了某個關鍵字的提交
默認不用任何參數(shù)的話,git log?會按提交時間列出所有的更新,最近的更新排在最上面。
git log # 查看所有提交歷史
git log -p -n # 查看最近提交的n條歷史
git log -p -n <filename> # 查看指定文件最近提交的n條歷史
git log alias配置
git ????log --pretty=format:'%s %C(bold blue)(%an)%Creset' --abbrev-commitgit?
git????log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
#設置git alias?
git config --global alias.slg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
9. 標簽
Git?可以給歷史中的某一個提交打上標簽,以示重要。
Git?使用兩種主要類型的標簽:輕量標簽(lightweight)與附注標簽(annotated)。
輕量標簽: 很像一個不會改變的分支 - 它只是一個特定提交的引用。它本質上是將提交校驗和存儲到一個文件中 - 沒有保存任何其他信息。
附注標簽是存儲在?Git?數(shù)據(jù)庫中的一個完整對象。 它們是可以被校驗的;其中包含打標簽者的名字、電子郵件地址、日期時間;還有一個標簽信息;并且可以使用?GNU Privacy Guard(GPG)簽名與驗證。 通常建議創(chuàng)建附注標簽,這樣你可以擁有以上所有信息;但是如果你只是想用一個臨時的標簽,或者因為某些原因不想要保存那些信息,輕量標簽也是可用的。
-a: 創(chuàng)建附注標簽
-m?選項指定了一條將會存儲在標簽中的信息。 如果沒有為附注標簽指定一條信息,Git?會運行編輯器要求你輸入信息。
git tag # 列出已有的標簽
git tag <tagname> # 創(chuàng)建標簽,-a 創(chuàng)建附注標簽
git tag -d <tagname> # 刪除掉你本地倉庫上的標簽
git show <tagname> # 查看標簽信息與對應的提交信息
git push origin <tagname> # 推送標簽到遠程倉庫服務器上
git push origin --tags # 一次性推送所有不在遠程倉庫服務器上的標簽
9. 標簽
Git?可以給歷史中的某一個提交打上標簽,以示重要。
Git?使用兩種主要類型的標簽:輕量標簽(lightweight)與附注標簽(annotated)。
輕量標簽: 很像一個不會改變的分支 - 它只是一個特定提交的引用。它本質上是將提交校驗和存儲到一個文件中 - 沒有保存任何其他信息。
附注標簽是存儲在?Git?數(shù)據(jù)庫中的一個完整對象。 它們是可以被校驗的;其中包含打標簽者的名字、電子郵件地址、日期時間;還有一個標簽信息;并且可以使用?GNU Privacy Guard(GPG)簽名與驗證。 通常建議創(chuàng)建附注標簽,這樣你可以擁有以上所有信息;但是如果你只是想用一個臨時的標簽,或者因為某些原因不想要保存那些信息,輕量標簽也是可用的。
-a: 創(chuàng)建附注標簽
-m?選項指定了一條將會存儲在標簽中的信息。 如果沒有為附注標簽指定一條信息,Git?會運行編輯器要求你輸入信息。
git tag # 列出已有的標簽
git tag <tagname> # 創(chuàng)建標簽,-a 創(chuàng)建附注標簽
git tag -d <tagname> # 刪除掉你本地倉庫上的標簽
git show <tagname> # 查看標簽信息與對應的提交信息
git push origin <tagname> # 推送標簽到遠程倉庫服務器上
git push origin --tags # 一次性推送所有不在遠程倉庫服務器上的標簽
10. 變基
merge: 用來合并一個或者多個分支到你已經檢出的分支中, 然后它將當前分支指針移動到合并結果上,現(xiàn)有分支不會被修改。
rebase: 通常稱之為“衍合”,它通過修改提交歷史來對比雙方的commit,然后找出不同的去緩存,然后在去push,修改你的commit歷史。
cherry-pick: 用于將在其他分支上的 commit 修改,移植到當前的分支(HEAD),?-x?參數(shù),表示保留原提交的作者信息進行提交。
git merge <branch> # 合并指定分支到當前分支
git rebase <branch> # 衍合指定分支到當前分支
# 用于將在其他分支上的 commit 修改,移植到當前的分支(HEAD), <start-commit-id>…<end-commit-id>左開右閉,<start-commit-id>^…<end-commit-id>全閉git cherry-pick …
11. 儲藏與清理
當你在項目的一部分上已經工作一段時間后,所有東西都進入了混亂的狀態(tài),而這時你想要切換到另一個分支做一點別的事情。 問題是,你不想僅僅因為過會兒回到這一點而為做了一半的工作創(chuàng)建一次提交。
儲藏會處理工作目錄的臟的狀態(tài) - 即,修改的跟蹤文件與暫存改動 - 然后將未完成的修改保存到一個棧上,而你可以在任何時候重新應用這些改動。
git add . && git stash # 將新的儲藏推送到棧上
git stash save 'message' # 儲藏修改,并留下stash信息
# -p(或-patch)允許交互選擇要提交的每個跟蹤文件的各個部分。 這樣每個提交只包含相關的更改。git stash -p?
# 默認情況下,當存儲時,不包括未跟蹤的文件。 為了更改該行為并包含這些文件,您需要使用-u參數(shù)。 還有-a(-all)可以完全存儲未跟蹤和忽略的文件,這可能是您通常不需要的東西。git stash -u
git stash list # 查看棧中所有暫存
git stash apply <stash_id> # 恢復復對應編號暫存到工作區(qū),如果不指定編號為棧頂?shù)模⒁猓哼@些暫存還在棧中
git stash pop <stash_id> #將棧頂?shù)臅捍妫謴偷焦ぷ鲄^(qū),并從棧中彈出,注意:這些暫存不在棧中
git stash drop <stash_id> # 移除的儲藏在棧中的東西
git stash clear #清空暫存棧
git stash branch <branch_name> # 從儲藏創(chuàng)建一個分支
12. 遠程操作
遠程倉庫是指托管在因特網或其他網絡中的你的項目的版本庫。
git remote # 查看已配置的遠程倉庫服務器
git remote -v # 指定選項 -v,會顯示需要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL。
git remote show <remote-name> # 查看制定遠程倉庫的更多信息
git remote add <shortname> <url> # 添加一個新的遠程 Git 倉庫
git remote rm <name> # 移除遠程倉庫
git remote rename <oldname> <newname># 重命名遠程倉庫
git fetch <remote-name> # 從遠程倉庫中拉取數(shù)據(jù)
# 下載代碼及快速合并, 當你想拉取origin服務器上的當前分支名的代碼時,可簡寫git pullgit pull <remote-name> <branch-name>
# 第一次推送到遠程倉庫,--set-upstream可簡寫為-ugit push --set-upstream <remote-name> <branch-name>
# 推送到遠程倉庫, 當你想將當前開發(fā)分支名推送到 origin 服務器,可簡寫為git pushgit push <remote> <branch-name>?
git push [remote] --force # 強行推送當前分支到遠程倉庫,即使有沖突?
git push [remote] --all # 推送所有分支到遠程倉庫?
git push : # 刪除遠程分支或標簽?
git push --tag # 上傳所有標簽?
13. 沖突
# 一次打開所有沖突的文件,重新綁定可能會導致沖突,以下命令將打開需要您幫助解決這些沖突的所有文件。git diff --name-only --diff-filter=U | uniq | xargs $EDITOR
從本地初始化到上傳到GitHub遠程倉庫的一般步驟
git init
git add .
git commit -m 'hint message'
git remote add origin 'your project repositories href on github'
git pull origin master
git push -u origin master
原文地址:https://segmentfault.com/a/1190000019116365
原文作者:RainyK1