Git命令和操作的學習及在線練習



標題: Git命令和操作的學習及在線練習
作者: 夢幻之心星   sky-seeker@qq.com
標簽: [Git, 版本控制]
目錄: [軟件]
日期: 2020-07-18

  • Git是一種分布式版本控制系統
    Git Flow模型圖

基礎知識

  • Git 的三個分區和文件的三種狀態
    Git基本命令

    分區 用途 對應的文件狀態
    工作區 存放代碼文件 modified
    暫存區 臨時存放代碼文件 staged
    本地庫 存放歷史版本信息 committed

本地操作

Git基本操作

創建倉庫

  • 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 <提交號>   //重置到指定提交號
    
  • 重置有三種模式:hardsoftmixed

  • 默認使用混合重置(mixed)模式

硬重置

  • git reset --hard <提交號>命令將工作區、暫存區、本地庫都重置到這個選定的版本上。
  • 整體狀態直接重置到特定提交之前的狀態。
  • 效果看起來等同於清空暫存區和工作區。
    git reset --hard <提交號>

軟重置

  • git reset --soft <提交號>命令將本地庫重置到這個選定的版本上,保留工作區、暫存區的中的內容。
  • HEAD 移至指定的提交,而不會移除該提交之后加入的修改。
  • 效果看起來就是工作目錄的內容不變,暫存區原有的內容也不變,只是原節點和Reset節點之間的所有差異都會放到暫存區中。
    git reset --soft xxx

混合重置

  • git reset --mixed <提交號>命令將暫存區、本地庫重置到這個選定的版本上,保留工作區中的內容。
  • 效果看起來就是原節點和Reset節點之間的所有差異都會放到工作目錄中。

還原

  • git revert命令用於撤銷修改。通過對特定的提交執行還原操作,會創建一個包含已還原修改的新提交。
    git revert

高級操作

揀選

  • cherry-pick <提交號> 命令用於復制特定分支的某個提交到活動分支。
  • 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 是表示這個 reftag 相差有多少個提交記錄, hash 表示的是所給定的 ref 所表示的提交記錄哈希值的前幾位。

遠程交互

Git基本流程

推送

  • git push命令將本地庫的數據推送到遠程庫。

克隆

  • git clone命令將遠程庫的數據拷貝到本地庫。

拉取

  • git pull命令將遠程庫的數據拷貝到本地庫,然后自動合並到本地分支中。
  • 實際上是git fetchgit merge兩個命令合成了一個。
    git pull

獲取

  • git fetch命令將遠程庫的數據拷貝到本地庫,但是工作區中的文件沒有更新。
    git fetch

變基

  • git rebase命令將當前分支的提交復制到指定的分支之上。
  • 變基的作用更多的是來整合分叉的歷史。
    git rebase
  • 變基與合並有一個重大的區別:Git 不會嘗試確定要保留或不保留哪些文件。執行 rebase 的分支總是含有想要保留的最新近的修改!這樣不會遇到任何合並沖突,而且可以保留一個漂亮的、線性的 Git 歷史記錄。

高級操作

交互式變基

  • 交互式變基指的是使用帶參數 --interactiverebase 命令, 簡寫為 -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-forwardno-fast-forward

快速合並

  • 在當前分支相比於要合並的分支沒有額外的提交時,可以執行 fast-forward 合並。這類合並不會創建新的提交,而是會將正在合並的分支上的提交直接合並到當前分支。Git 優先執行這種合並方式。
    640

非快速合並

  • git merge --no-ff <branchName>命令用於禁用快速合並
  • 在當前分支上提交想要合並的分支不具備的改變,那么 git 將會執行 no-fast-forward 合並。這類合並會在當前活動分支上創建新的合並提交。這個提交的父提交指向這個活動分支,也指向想要合並的分支。
    640 (1)

手動合並

  • 想要合並的兩個分支的同一文件中的同一行代碼上有不同的修改,或者一個分支刪除了一個文件而另一個分支修改了這個文件時,此時就需要手動合並沖突。
    640 (2)

Git 屬性

  • 可以用 Git 屬性指示 Git 識別二進制文件以及如何處理特定格式的文件

識別二進制文件

  • 如指定 Git 把所有pbxproj文件當成二進制文件,添加下面的行到 .gitattributes 文件:
    *.pbxproj binary
    

比較二進制文件

  • 方法1:使用工具把二進制文件轉化為純文本格式,再使用 diff 命令進行文本對比。
  • 方法2:從二進制文件中獲取元數據,再使用 diff 命令對元數據進行對比。

Word文檔

  1. 安裝 pandoc
  2. 添加下面的行到 .gitattributes 文件
*.doc diff=pandoc
  1. 添加下面的行到 .git/config 文件
[diff "pandoc"]
  textconv=pandoc --to=markdown
  prompt = false

圖像文件

  1. 安裝 exif
  2. 添加下面的行到 .gitattributes 文件
*.jpg diff=exif
  1. 添加下面的行到 .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
    640
  • 所有 Git 分支都被可視化,只需要在左側的命令行輸入 Git 命令,分支會進行相應的變化。每次 commit 都抽象成樹的節點,用動畫闖關的形式,讓你自由使用 Git 命令完成目標。
    640 (1)
  • 教程包含本地 Git 倉庫的版本管理和遠程倉庫的操作,很適合初學和進階。
    640 (2)

參考書籍

  • GitHub入門與實踐-[日] 大塚弘記-人民郵電出版社-2015年7月-9787115394095

參考資料


版權聲明:本文為「夢幻之心星」原創,依據 CC BY-NC-SA 4.0 許可證進行授權,轉載請附上原文出處鏈接及本聲明。


博客園地址:https://www.cnblogs.com/Sky-seeker

微信公眾號:關注微信公眾號,獲取即時推送
微信名:夢幻之心星 微信號:Sky-seeker



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM