在線練習
https://learngitbranching.js.org/?locale=zh_CNgit
閱讀git官網的Book, 順手記錄一下,方便查閱
https://git-scm.com/book/en/v2vim
git 基礎命令
git config
- /etc/gitconfig 文件: 包含系統上每個用戶及他們倉庫的通用配置。 若是在執行 git config 時帶上 --system 選項,那麼它就會讀寫該文件中的配置變量。 (因爲它是系統配置文件,所以你須要管理員或超級用戶權限來修改它。)
- ~/.gitconfig 或 ~/.config/git/config 文件:只針對當前用戶。 你能夠傳遞 --global 選項讓 Git 讀寫此文件,這會對你係統上 全部 的倉庫生效。
- 當前使用倉庫的 Git 目錄中的 config 文件(即 .git/config):針對該倉庫。 你能夠傳遞 --local 選項讓 Git 強制讀寫此文件,雖然默認狀況下用的就是它。。 (固然,你須要進入某個 Git 倉庫中才能讓該選項生效。)
-
配置用戶:緩存
- git config --global user.name 「username」
- git config --global user.eamil 「email」
- 當你想針對特定項目使用不一樣的用戶名稱與郵件地址時,能夠在那個項目目錄下運行沒有 --global 選項的命令來配置。(–local 至關於上述的local)
-
配置編輯器服務器
- git config --global core.editor.vim
- 當 Git 須要你輸入信息時會調用它。 若是未配置,Git 會使用操做系統默認的文本編輯器。
-
查看配置信息app
- 查看當前倉庫的配置: git config --list
- git config < key >
git help
- git help < verb >
- git < verb > --help
- man git-< verb >
git init
該命令將建立一個名爲 .git 的子目錄,這個子目錄含有你初始化的 Git 倉庫中全部的必須文件,這些文件是 Git 倉庫的骨幹。 可是,在這個時候,咱們僅僅是作了一個初始化的操做,你的項目裏的文件尚未被跟蹤。編輯器
git clone
- 若是你想得到一份已經存在了的 Git 倉庫的拷貝,好比說,你想爲某個開源項目貢獻本身的一份力,這時就要用到 git clone 命令。
- 若是你對其它的 VCS 系統(好比說 Subversion)很熟悉,請留心一下你所使用的命令是"clone"而不是"checkout"。 這是 Git 區別於其它版本控制系統的一個重要特性,Git 克隆的是該 Git 倉庫服務器上的幾乎全部數據,而不是僅僅複製完成你的工做所須要文件。
- 當你執行 git clone 命令的時候,默認配置下遠程 Git 倉庫中的每個文件的每個版本都將被拉取下來。 事實上,若是你的服務器的磁盤壞掉了,你一般可使用任何一個克隆下來的用戶端來重建服務器上的倉庫 (雖然可能會丟失某些服務器端的鉤子(hook)設置,可是全部版本的數據仍在.
- 克隆倉庫的命令是 git clone < url >
- 克隆遠程倉庫的時候,自定義本地倉庫的名字 git clone < url > newname
git status
- 能夠用 git status 命令查看哪些文件處於什麼狀態。
- git status --short 獲得一種格式更爲緊湊的輸出
git add
- 跟蹤一個未跟蹤的文件。
- 將跟蹤的文件放入暫存區
.gitignore
通常咱們總會有些文件無需歸入 Git 的管理,也不但願它們總出如今未跟蹤文件列表。 一般都是些自動生成的文件,好比日誌文件,或者編譯過程當中建立的臨時文件等。 在這種狀況下,咱們能夠建立一個名爲 .gitignore 的文件,列出要忽略的文件的模式。函數
*.[oa]
*~
第一行告訴 Git 忽略全部以 .o 或 .a 結尾的文件。
第二行告訴 Git 忽略全部名字以波浪符(~)結尾的文件,許多文本編輯軟件(好比 Emacs)都用這樣的文件名保存副本。
文件 .gitignore 的格式規範以下:工具
- 全部空行或者以 # 開頭的行都會被 Git 忽略。
- 可使用標準的 glob 模式匹配,它會遞歸地應用在整個工做區中。
- 匹配模式能夠以(/)開頭防止遞歸。
- 匹配模式能夠以(/)結尾指定目錄。
- 要忽略指定模式之外的文件或目錄,能夠在模式前加上歎號(!)取反。
git diff
- 不加參數直接輸入 git diff : 還沒有暫存的文件更新了哪些部分
- git diff --staged : 已暫存文件與最後一次提交的文件差別
- git diff --cached : --staged 和 --cached 是同義詞
- git diff --check : 它將會找到可能的空白錯誤並將它們爲你列出來
git commit
- git commit -m 「message」: 提交代碼
- 請記住,提交時記錄的是放在暫存區域的快照。 任何還未暫存文件的仍然保持已修改狀態,能夠在下次提交時歸入版本管理。 每一次運行提交操做,都是對你項目做一次快照,之後能夠回到這個狀態,或者進行比較。
- git commit -m -a 「message」: 儘管使用暫存區域的方式能夠精心準備要提交的細節,但有時候這麼作略顯繁瑣。 Git 提供了一個跳過使用暫存區域的方式, 只要在提交的時候,給 git commit 加上 -a 選項,Git 就會自動把全部已經跟蹤過的文件暫存起來一併提交。
- git commit -amend: 修改提交
git rm
- git rm file: 從已跟蹤文件清單中移除(確切地說,是從暫存區域移除), 並連帶從工做目錄中刪除指定的文件
- git rm -f file: 若是要刪除以前修改過或已經放到暫存區的文件,則必須使用強制刪除選項 -f(譯註:即 force 的首字母)
- git rm --cached file: 讓文件保留在磁盤,可是並不想讓 Git 繼續跟蹤。
git mv
- git mv README.md README 至關於
mv README.md README
git rm README.md
git add README
不像其它的 VCS 系統,Git 並不顯式跟蹤文件移動操做。 若是在 Git 中重命名了某個文件,倉庫中存儲的元數據並不會體現出這是一次更名操做。 不過 Git 很是聰明,它會推斷出究竟發生了什麼。fetch
git log
- 在提交了若干更新,又或者克隆了某個項目以後,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的工具是 git log 命令
- git log --patch, 它會顯示每次提交所引入的差別(按 補丁 的格式輸出), 你也能夠限制顯示的日誌條目數量,例如使用 -2 選項來只顯示最近的兩次提交: git log -p -2
- git log --stat, 每次提交的簡略統計信息, 可使用 --stat 選項
- git log --relative-date, 使用較短的相對時間而不是完整格式顯示日期(好比「2 weeks ago」)
- git log --name-status, 顯示新增、修改、刪除的文件清單
- git log -oneline, --pretty=oneline --abbrev-commit 合用的簡寫。
- git log --author author_name, 顯示指定做者的提交
- git log --grep, 搜索提交說明中的關鍵字
- git log -S function_name, 只會顯示那些添加或刪除了該字符串的提交, 假設你想找出添加或刪除了對某一個特定函數的引用的提交,能夠調用
- 以上的夠用了,更多的https://git-scm.com/book/zh/v2/Git-基礎-查看提交歷史
git reset
- git reset HEAD [< file >], 取消暫存的文件
git stash
但願回到之前的版本,但又不想把現有的代碼提交。url
- git stash 建立臨時工做去
- git stash list 查看保存的工做區
- git stash apply stash@{1} 應用哪一個工做區
- git stash pop 應用上一個工做區而且刪除
- git stash drop stash@{0} 刪除指定的工做區
- git stash clear 刪除全部的工做區
git checkout
- git checkout – < file >, 請務必記得 git checkout – < file > 是一個危險的命令。 你對那個文件在本地的任何修改都會消失——Git 會用最近提交的版本覆蓋掉它。 除非你確實清楚不想要對那個文件的本地修改了,不然請不要使用這個命令。
git stash
- git stash: 建立保存臨時工做區
- git stash list: 查看保存的工做區
- git stash apply stash@{1}: 應用哪一個工做區
- git stash pop: 應用上一個工做區而且刪除
- git stash drop stash@{0}: 刪除指定的工做區
- git stash clear: 刪除全部的工做區
git remote
- 運行 git remote 命令, 它會列出你指定的每個遠程服務器的簡寫。
- git remote -v, 會顯示須要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL
- git remote add < shortname > < url >, 添加一個新的遠程 Git 倉庫,同時指定一個方便使用的簡寫
- git remote show < remote >, 查看某一個遠程倉庫的更多信息
-
git remote rename, 修改一個遠程倉庫的簡寫名
- git remote rename pb paul,將 pb 重命名爲 paul
-
git remote remove, 移除一個遠程倉庫
- 你已經從服務器上搬走了或再也不想使用某一個特定的鏡像了
- 又或者某一個貢獻者再也不貢獻了——可使用 git remote remove 或 git remote rm
git fetch
-
git fetch < remote >, 這個命令會訪問遠程倉庫,從中拉取全部你尚未的數據, 執行完成後,你將會擁有那個遠程倉庫中全部分支的引用,能夠隨時合併或查看。
- 若是你使用 clone 命令克隆了一個倉庫,命令會自動將其添加爲遠程倉庫並默認以 「origin」 爲簡寫。 因此,git fetch origin 會抓取克隆(或上一次抓取)後新推送的全部工做。
- 必須注意 git fetch 命令只會將數據下載到你的本地倉庫——它並不會自動合併或修改你當前的工做。 當準備好時你必須手動將其合併入你的工做。
git push
- git push origin master, 只有當你有所克隆服務器的寫入權限,而且以前沒有人推送過期,這條命令才能生效。 當你和其餘人在同一時間克隆,他們先推送到上游而後你再推送到上游,你的推送就會毫無疑問地被拒絕。 你必須先抓取他們的工做並將其合併進你的工做後才能推送。
git tag
-
git tag --lits, 列出已有的標籤
- git tag -l 「v1.8.5*」, 你也能夠按照特定的模式查找標籤。 例如,Git 自身的源代碼倉庫包含標籤的數量超過 500 個。 若是隻對 1.8.5 系列感興趣,能夠運行 git tag -l 「v1.8.5*」
-
git tag -a v1.4 -m 「my version 1.4」, 建立附註標籤(annotated)
- git show v1.4, 標籤信息和與之對應的提交信息
-
git tag v1.4-lw, 建立輕量標籤(lightweight)
- 輕量標籤本質上是將提交校驗和存儲到一個文件中——沒有保存任何其餘信息
- 建立輕量標籤,不須要使用 -a、-s 或 -m 選項,只須要提供標籤名字
-
後期打標籤
- git tag -a v1.2 9fceb02, 要在那個提交上打標籤,你須要在命令的末尾指定提交的校驗和(或部分校驗和)
-
共享標籤
- git push origin < tagname >, 默認狀況下,git push 命令並不會傳送標籤到遠程倉庫服務器上。 在建立完標籤後你必須顯式地推送標籤到共享服務器上
- git push origin --tags, 若是想要一次性推送不少標籤,也可使用帶有 --tags 選項的 git push 命令。 這將會把全部不在遠程倉庫服務器上的標籤所有傳送到那裏
- 使用 git push < remote > --tags 推送標籤並不會區分輕量標籤和附註標籤, 沒有簡單的選項可以讓你只選擇推送一種標籤。
-
git tag -d < tagname >, 刪除掉你本地倉庫上的標籤
- 注意上述命令並不會從任何遠程倉庫中移除這個標籤,你必須用 git push < remote > :refs/tags/< tagname > 來更新你的遠程倉庫, 上面這種操做的含義是,將冒號前面的空值推送到遠程標籤名,從而高效地刪除它。
- 第二種更直觀的刪除遠程標籤的方式是: git push origin --delete < tagname >
git 分支
git 分支工做原理: https://git-scm.com/book/zh/v2/Git-分支-分支簡介
git branch
-
git branch, 獲得當前全部分支
- git branch -v, 查看每個分支的最後一次提交
- git branch --merged, 查看哪些分支已經合併到當前分支
- git branch --no-merged, 查看哪些分支還沒有合併到當前分支
- git branch --no-merged master,查看哪些分支還沒有合併到master分支
git checkout
-
git checkout master, 這條命令作了兩件事。
- 一是使 HEAD 指回 master 分支
- 二是將工做目錄恢復成 master 分支所指向的快照內容
- git checkout -b < newbranchname >, 建立一個新分支後當即切換過去
- git checkout -b < branch > < remote >/< branch >, 建立一個新分支後當即切換過去, 而且跟蹤遠程倉庫的分支
git merge
-
git merge < branchname >, 在當前分支合併另外一個分支的修改
- 當你試圖合併兩個分支時, 若是順着一個分支走下去可以到達另外一個分支,那麼 Git 在合併二者的時候, 只會簡單的將指針向前推動(指針右移),由於這種狀況下的合併操做沒有須要解決的分歧——這就叫作 「快進(fast-forward)」
git add
- 合併時把有衝突的文件標記爲已解決狀態
git push
- git push origin --delete < branchname >, 刪除遠程分支
git rebase 變基
詳情: https://git-scm.com/book/zh/v2/Git-分支-變基
如何避免每次輸入密碼
- git config --global credential.helper cache, 若是你正在使用 HTTPS URL 來推送,Git 服務器會詢問用戶名與密碼。 默認狀況下它會在終端中提示服務器是否容許你進行推送。
若是不想在每一次推送時都輸入用戶名與密碼,你能夠設置一個 「credential cache」。 最簡單的方式就是將其保存在內存中幾分鐘,能夠簡單地運行 git config --global credential.helper cache 來設置它。