標題: Git命令和操作的學習及在線練習
作者: 夢幻之心星 sky-seeker@qq.com
標簽: [Git, 版本控制]
目錄: [軟件]
日期: 2020-07-18
- Git是一種分布式版本控制系統
基礎知識
-
Git 的三個分區和文件的三種狀態
分區 用途 對應的文件狀態 工作區 存放代碼文件 modified 暫存區 臨時存放代碼文件 staged 本地庫 存放歷史版本信息 committed
本地操作
創建倉庫
git init
將當前的目錄轉換成一個倉庫git init <directory>
命令用於在指定目錄創建名為的空倉庫 git init --bare <directory>
命令用於創建一個沒有工作目錄的裸倉庫。裸倉庫以 .git 結尾,作為儲存代碼的中央倉庫。- 如
git init --bare my-project.git
命令創建了一個用於代碼共享的裸倉庫。
- 如
添加
git add
命令將工作區的文件添加到暫存區。可以通過修改.gitignore文件來設置不需要添加的文件。
提交
git commit
命令將暫存區的文件提交到本地庫。git commit -m "comment"
命令在提交時進行說明,說明改動的內容或原因。git commit --amend
命令把新的內容添加到之前的提交里面,這樣就還是同一條提交日志信息。
狀態
git status
命令用於查看狀態。
日志
git log
命令用於查看提交日志,從近到遠顯示每次提交的評論、作者、日期等信息。git reflog
命令用於查看命令日志。- commit 后面的編號,是每次歷史記錄的一個索引。如果需要對版本進行前進或者后退的時候,就需要用到它。
重置
-
git reset
命令用於將當前版本回退到選定的版本。 -
重置的方法
git reset HEAD^^^ //向上返回3代 git reset HEAD~~~ //向上返回3代 git reset HEAD~3 //向上返回3代 git reset <提交號> //重置到指定提交號
-
重置有三種模式:
hard
、soft
、mixed
-
默認使用混合重置(
mixed
)模式
硬重置
git reset --hard <提交號>
命令將工作區、暫存區、本地庫都重置到這個選定的版本上。- 整體狀態直接重置到特定提交之前的狀態。
- 效果看起來等同於清空暫存區和工作區。
軟重置
git reset --soft <提交號>
命令將本地庫重置到這個選定的版本上,保留工作區、暫存區的中的內容。- HEAD 移至指定的提交,而不會移除該提交之后加入的修改。
- 效果看起來就是工作目錄的內容不變,暫存區原有的內容也不變,只是原節點和Reset節點之間的所有差異都會放到暫存區中。
混合重置
git reset --mixed <提交號>
命令將暫存區、本地庫重置到這個選定的版本上,保留工作區中的內容。- 效果看起來就是原節點和Reset節點之間的所有差異都會放到工作目錄中。
還原
git revert
命令用於撤銷修改。通過對特定的提交執行還原操作,會創建一個包含已還原修改的新提交。
高級操作
揀選
cherry-pick <提交號>
命令用於復制特定分支的某個提交到活動分支。cherry-pick <提交號> <提交號>
命令用於復制特定分支的多個提交到活動分支。
恢復
git checkout [file]
命令恢復暫存區的指定文件到工作區。git checkout .
命令恢復暫存區的所有文件到工作區。git checkout [commit] [file]
命令恢復指定提交的指定文件到暫存區和工作區。
本地棧式提交
- 用於修改提交的評論
git rebase -i HEAD~3
+git commit --amend
+git rebase -i HEAD~3
git cherry-pick <提交號>
+git commit --amend
+git cherry-pick <提交號>
標簽
git tag <標簽號> <提交號>
命令用於為指定提交號創建一個標簽git tag -a <標簽號> -m <提交信息> <提交號>
命令用於為指定提交號創建一個帶有說明的標簽git tag -d <標簽號>
命令用於刪除一個標簽git push origin <標簽號>
命令用於推送某個標簽到遠程倉庫git push origin --tags
命令用於推送全部尚未推送到遠程倉庫的本地標簽git push origin :refs/tags/<標簽號>
命令用於刪除遠程倉庫中的指定標簽
描述
Git Describe <ref>
命令用於查找離最近的錨點(標簽)git bisect
命令用於查找產生 Bug 的提交記錄<ref>
可以是任何能被 Git 識別成提交記錄的引用,未指定時,以目前所檢出的位置(HEAD
)為默認位置。- 執行
Git Describe
命令后輸出的結果:<tag>_<numCommits>_g<hash>
tag
表示的是離ref
最近的標簽,numCommits
是表示這個ref
與tag
相差有多少個提交記錄,hash
表示的是所給定的ref
所表示的提交記錄哈希值的前幾位。
遠程交互
推送
git push
命令將本地庫的數據推送到遠程庫。
克隆
git clone
命令將遠程庫的數據拷貝到本地庫。
拉取
git pull
命令將遠程庫的數據拷貝到本地庫,然后自動合並到本地分支中。- 實際上是
git fetch
和git merge
兩個命令合成了一個。
獲取
git fetch
命令將遠程庫的數據拷貝到本地庫,但是工作區中的文件沒有更新。
變基
git rebase
命令將當前分支的提交復制到指定的分支之上。- 變基的作用更多的是來整合分叉的歷史。
- 變基與合並有一個重大的區別:Git 不會嘗試確定要保留或不保留哪些文件。執行 rebase 的分支總是含有想要保留的最新近的修改!這樣不會遇到任何合並沖突,而且可以保留一個漂亮的、線性的 Git 歷史記錄。
高級操作
交互式變基
- 交互式變基指的是使用帶參數
--interactive
的 rebase 命令, 簡寫為-i
。 git rebase -i HEAD~3
命令用於修改最近 3 條提交。- 交互式變基在當前開發的分支上想要修改某些提交時會很有用。
- 在 rebase 的提交上,可以執行以下 6 個動作:
- reword:修改提交信息;
- edit:修改此提交;
- squash:將提交融合到前一個提交中;
- fixup:將提交融合到前一個提交中,不保留該提交的日志消息;
- exec:在每個提交上運行我們想要 rebase 的命令;
- drop:移除該提交。
遠程跟蹤
git checkout -b <本地分支名> o/<遠程分支名>
git branch -u o/<遠程分支名> <本地分支名>
關聯遠程倉庫
git remote add origin <url>
命令用於關聯遠程倉庫git push -u origin master
命令用於關聯遠程倉庫並進行第一次推送
同步倉庫的分支
同名指定分支
git push <remote> <place>
命令用於同步本地倉庫到遠程倉庫的指定分支。git fetch <remote> <place>
命令用於同步遠程倉庫到本地倉庫的指定分支。- 如
git push origin master
,這個命令的作用是切換到本地倉庫中的master分支,獲取所有的提交,再到遠程倉庫origin中找到master分支,將遠程倉庫中沒有的提交記錄都添加上去。
不同名指定分支
git push origin <source>:<destination>
命令將來源和目的地不同的分支同步到遠程倉庫。- 如果要推送到的目的分支不存在,Git 會在遠程倉庫中根據提供的名稱自動創建分支。
git fetch origin <source>:<destination>
命令將來源和目的地不同的分支同步到本地倉庫。- 如果要推送到的目的分支不存在,Git 會在本地倉庫中根據提供的名稱自動創建分支。
刪除遠程倉庫中的分支
git push origin :<destination>
命令來源分支為空,會刪除遠程倉庫中的目的地分支。
創建本地倉庫中的分支
git fetch origin :<destination>
命令來源分支為空,會在本地倉庫中創建一個新分支。
Git pull 的參數
-
git pull origin foo
相當於:git fetch origin foo
+git merge o/foo
-
git pull origin bar~1:bugFix
相當於:git fetch origin bar~1:bugFix
+git merge bugFix
分支管理
查看分支:
git branch
命令用於列出當前所有分支。git branch -v
能夠顯示更多信息。
創建分支:
git branch <branchName>
命令用於創建分支git branch <branchName> <提交號>
命令用於創建分支並關聯到對應的提交號git branch -f <branchName> <提交號>
命令用於強制移動分支到對應的提交號git checkout -b <branchName>
命令用於創建並切換分支
切換分支:
git checkout <branchName>
命令用於切換分支git checkout <提交號>
命令用於切換到對應的提交號git checkout HEAD^2
命令用於指定提交記錄的某個父提交
合並分支:
git merge <branchName>
命令用於合並分支- Git 可執行兩種類型的合並:fast-forward 和 no-fast-forward。
快速合並
- 在當前分支相比於要合並的分支沒有額外的提交時,可以執行
fast-forward
合並。這類合並不會創建新的提交,而是會將正在合並的分支上的提交直接合並到當前分支。Git 優先執行這種合並方式。
非快速合並
git merge --no-ff <branchName>
命令用於禁用快速合並- 在當前分支上提交想要合並的分支不具備的改變,那么 git 將會執行
no-fast-forward
合並。這類合並會在當前活動分支上創建新的合並提交。這個提交的父提交指向這個活動分支,也指向想要合並的分支。
手動合並
- 想要合並的兩個分支的同一文件中的同一行代碼上有不同的修改,或者一個分支刪除了一個文件而另一個分支修改了這個文件時,此時就需要手動合並沖突。
Git 屬性
- 可以用 Git 屬性指示 Git 識別二進制文件以及如何處理特定格式的文件
識別二進制文件
- 如指定 Git 把所有pbxproj文件當成二進制文件,添加下面的行到 .gitattributes 文件:
*.pbxproj binary
比較二進制文件
- 方法1:使用工具把二進制文件轉化為純文本格式,再使用 diff 命令進行文本對比。
- 方法2:從二進制文件中獲取元數據,再使用 diff 命令對元數據進行對比。
Word文檔
- 安裝 pandoc
- 添加下面的行到 .gitattributes 文件
*.doc diff=pandoc
- 添加下面的行到 .git/config 文件
[diff "pandoc"]
textconv=pandoc --to=markdown
prompt = false
圖像文件
- 安裝 exif
- 添加下面的行到 .gitattributes 文件
*.jpg diff=exif
- 添加下面的行到 .git/config 文件
[diff "exif"]
textconv = exiftool
注意事項
- 在一個Git庫中可以有多個gitattributes文件
- 同一個gitattributes文件中,按照行的先后順序,后序的設置覆蓋前序
- 不同gitattributes文件中,屬性設置的優先級如下所示(從高到低)
/myproj/info/attributes /myproj/my_path/.gitattributes /myproj/.gitattributes
練習 Git
- Learning Git Branching 項目是學習 Git 的在線練習平台。
- 開源項目地址:https://github.com/pcottle/learnGitBranching
- 教程網站地址:https://learngitbranching.js.org
- 所有 Git 分支都被可視化,只需要在左側的命令行輸入 Git 命令,分支會進行相應的變化。每次 commit 都抽象成樹的節點,用動畫闖關的形式,讓你自由使用 Git 命令完成目標。
- 教程包含本地 Git 倉庫的版本管理和遠程倉庫的操作,很適合初學和進階。
參考書籍
- GitHub入門與實踐-[日] 大塚弘記-人民郵電出版社-2015年7月-9787115394095
參考資料
- 廖雪峰Git教程
- Pro Git中文版(第二版)
- 想進互聯網大廠,不懂Git 看這一篇就夠了
- 工作流一目了然,看小姐姐用動圖展示 10 大 Git 命令
- 通過 .git 目錄深入理解 Git!
- Git學習筆記(SourceTree克隆、提交、推送、拉取等)
- git-scm文獻資料
- 圖解Git
- Git Reset 三種模式
- Git常用命令及方法大全
版權聲明:本文為「夢幻之心星」原創,依據 CC BY-NC-SA 4.0 許可證進行授權,轉載請附上原文出處鏈接及本聲明。
博客園地址:https://www.cnblogs.com/Sky-seeker
微信公眾號:關注微信公眾號,獲取即時推送