git学习笔记

git学习笔记

七月 07, 2020

Git學習筆記

寫在前面

之前一直在使用git,但確實沒有好好學習過,現在決定寫個筆記,但主要以我目前用過的爲主,以及之後可能會遇到的問題,參考文檔為:

  1. git的學習文檔https://git-scm.com/book/zh/v2
  2. 廖雪峰的教程https://www.liaoxuefeng.com/wiki/896043488029600
  3. 阮一峰的網絡日志1http://www.ruanyifeng.com/blog/2014/06/git_remote.html
  4. 阮一峰的網絡日志2http://www.ruanyifeng.com/blog/2012/07/git.html
  5. 阮一峰的網絡日志3http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html
  6. Git分支https://www.open-open.com/lib/view/open1328069889514.html

在寫這篇博客是使用的系統為windows,使用的是git for windows

版本為2.21.0.windows.1

關於學習與練習,可以訪問https://learngitbranching.js.org進行學習與練習

git初始化及其基本命令

安裝

git在linux上可以使用命令直接安裝,在windows上我使用的是git fot windows

第一步及基本命令

在安裝完git之後首先需要設置你的用戶名與郵箱

1
2
git config --global user.name "用戶名"
git config --global user.email "郵箱"

可以使用命令查看當前的配置信息

1
2
git config --list
# 輸入q推出

也可以單獨查看某一個配置信息

1
2
git config user.email
# 查看你之前使用的郵箱

這裏可以配置默認的文本編輯器,官方文檔說“当 Git 需要你输入信息时会调用它”,但我好像不記得我用過了,不過這裏記一下

1
2
3
4
5
# linux
git config --global core.editor emacs
# windows
# 則例使用的是notepad++
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

遇到了麻煩可以使用該命令來獲取幫助

1
git --help

如果是需要單獨命令的幫助可以使用

1
2
3
4
git help <命令>
git <命令> --help
# 也可以使用
# git <命令> -h

使用git進行本地版本管理

進入到你想要使用git的文件夾中(windows可以在進入文件夾后,右擊Git Bash Here來使用命令進行管理),通過命令對初始化本地倉庫

1
git init

這個命令可以在空或者非空的文件夾中執行,執行過後會生成.git文件,這個就是Git来跟踪管理版本库的

可以使用下面命令對文件進行添加以及進行本地管理

1
2
3
4
# 添加文件到本地倉庫
git add 文件或文件夾的名稱
# 把文件提交倉庫並進行説明
git commit -m "説明"

其他説明

这里之后会陆续更新

1
2
3
4
5
6
7
git add 文件或文件夾的名稱
# 这里后面可以更多个文件名
git add -A
# 可以添加所有
# 但是在windows实际使用中会遇到小问题
# 比如这个里面的文件是别人写的,拷贝到你电脑上来,然后你想使用这个命令添加的话会报转义符的错误(我没记错的话好像是的,之后遇到里再补截图)
# 解决方法是使用git add .

遠程倉庫管理

遠程倉庫可以使用gitee或者github或者自己搭建的git服務器或者其他的

這裏我是用的是gitee進行測試

最簡單方便省事的方法就是在git伺服器中建立倉庫並且選擇使用Readme檔初始化倉庫,之後使用命令克隆到本地倉庫,再把需要管理的檔案複製到克隆建立的資料夾裡,之後使用命令提交到遠端倉庫

1
2
3
4
5
6
7
8
# 從遠程倉庫中克隆
git clone 複製的地址(這裏可以先使用https協議)
# 添加所有文件
git add -A
# 把文件提交倉庫並進行説明
git commit -m "説明"
# 推送到遠程倉庫
git push

當然你也可以在初始化完本地倉庫后,將之于遠端創建的空倉庫關聯起來

1
2
3
4
5
6
# 初始化
git init
# 將遠端與倉庫與本地倉庫關聯起來
git remote add origin 遠端地址
# 推送到遠程倉庫並將當前分支設置為主分支
git push -u origin master
1
2
git branch --set-upstream-to=origin/<branch> master
# 該命令可以將遠程分支與本地分支進行關聯

可以使用命令查看倉庫使用的簡寫與其對應的url

1
git remote -v

如果遠端有更新可以使用命令同步到本地

1
git pull

查看提交記錄及壽説明

1
git log

其中commit 右邊為版本號,Author為提交人,Date為時間,下方為提交説明

可以使用命令退回到指定版本

1
git reset --hard 版本號

退回上一個版本

1
git reset --hard HEAD

之後將會詳細的講解版本管理,這裏製作簡單介紹

git push

git push將本地倉庫的更新推送到遠程倉庫,簡單列舉常用參數

1
2
3
4
git push -f | --force
# 强制推送,儅我們返回較老版本的時候,會出現無法推送的情況,此時可以强制推送
git push --set-upstream 遠端主機名 分支名
# 如果创建了新分支 可以将新分支推送到远端

關於主機名

为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名

查看遠程的所有主機

1
git remote

查看遠程主機的網址

1
git remote -v

當然還可以修改、添加、刪除,不過這裏不做羅列,具體的可以查看詳細的文檔或者使用help

修改遠程倉庫地址

1
git remote set-url 主機名 主機地址

仓库更新

關於仓库更新的大致如下圖所示,具體的後面會再次分析(這張圖不一定完全正確,但可以表達各個命令的意思與作用)

git提交

其中可以使用git status查看當前倉庫的狀態,例如本地有沒有更新修改,遠端有沒有新的版本提交修改(這裏的遠端倉庫更新需要git fetch才能看見,否則是看不見的)

git diff可以查看本地每個文件的修改情況

接下來介紹git fetchgit merge

其实从上图也可以看出 git fetch + git merge == git pull

那這裏有什麽不同麽,既然既然可以直接更新爲什麽還要分成兩部呢?

簡單來説分開來的好處是可以產看遠端倉庫更新了什麽,與本地的區別,再進行更新同步

git fetch

git fetch會將遠端的更新取回本地,但並不會直接合并到本地倉庫,這樣就不會直接造成版本文件的衝突,這裏可以像上圖那樣理解使用git fetch后將遠端倉庫移動至本地的遠端倉庫副本

這裏可以使用命令查看具體情況

1
2
3
4
5
git branch -a
# 輸出
# * master (这个就是我们当前的本的分支,这里只有主分支)
# remotes/origin/master (这里是远端仓库在本地的副本)
# 关于分支的后面会详细将,这里就看看

之後我們可以查看遠端分支與本地的區別,我找到了以下的幾種方法,具體的方法肯定還有很多,這裏只列舉我找的(暫不考慮有多分支的情況,這裏我只嘗試的簡單的情況,後續可能會更新其他負責的情況)

  1. 通過使用git log比較兩個分支的區別

    1
    git log -p master.. origin/master

    通過使用git log -p可以比較每次提交或者不同分支的差異

    可以查看到各個增刪改的文件的差異(不同的部分)

    以下也是同理(在將更新同步到本地后產生一個FETCH_HEAD)

    1
    git log -p FETCH_HEAD
  1. 使用git difftool使用圖形化界面比較修改文件差異

    1
    2
    git difftool origin
    # :qa! 退出

    其中左邊的是遠端的,右邊是本地的

  1. VSCODE中可以使用GitLens插件(簡單無腦還直觀,確實不錯,比較推薦)

    之後即可點擊查看具體更新的内用以及差異

git merge

git merge是用于分支合并的命令,这里的作用其实将origin/master合并到master

具体的可以查看后买你的分支管理

版本管理

关于git的版本管理主要由幾個命令組成

1
2
3
4
git log # 查看提交的历史纪录
git reflog # 查看历史操作记录
git reset # 版本回退
git revert # 撤销操作

git log

git log會記錄你每次提交的更新,從新到舊降序配列

其中commit 右邊為版本號,Author為提交人,Date為時間,下方為提交説明

一下為git log後面可以跟的常用參數列舉

1
2
3
4
5
6
7
8
git log -<number>
# 列舉最近n條記錄
git log --stat
# 列舉出每次提交與提交前的不同的行數
git log --patch
# 列舉出每次提交與提交前具體的不同之處 這裏也可以用簡寫 -p 或 -u
git log --author=<pattern>
# 列出指定作者的提交,這裏的<pattern>可以是name或是email 同時只要包含該子字符串的都會匹配,所以你可以之輸入部分關鍵字符

最後你可以使用gitk命令使用圖形化工具來查看提交歷史

git reflog

git reflog會記錄之前操作的歷史例如:git reset git commit git revert git pull等命令的記錄

其中 最左邊的是版號的前面7位,右邊為具體命令以及提示

注意

git log只能查看到前及以前的版本,例如:你現在提交到了第5次,當你使用git reset回到第3次后,你是無法在查看第4、5次提交的,但通過git reflog可以查看到你每次的操作歷史,可以通過reflog的版本號來進行恢復

git reset

git reset可以將版本回復到指定的狀態,通常用於撤銷之前的操作、關於常用參數主要有一下三個

1
2
3
4
5
6
7
8
git reset --mixed 版本號
# mixed:将HEAD之后的变更内容放到工作区中
git reset --hard 版本號
# soft:代表将HEAD之后的变更内容放到暂存区中。
git reset --hard 版本號
# hard:将HEAD之后的变更内容全部丢弃。
git reset --hard 分支名
# 可是其他分支覆盖当前分支,但这个分支不能是当前分支
tips

關於後面的版本號,可以是git log或者是git reflog中的

版本號可以不用完全輸全,只輸前幾位也可以,但必須是從頭開始,不可以是不包含第一位的子串,當然也可以是HEAD^之類的

git revert

git revert可以將版本撤銷(有的也叫反做),可以理解為將版本回滾到某個版本,但與git reset不同的是、git revert是將撤銷后的版本作爲新的版本。例如:我現在提交到了第5次,當我使用git revert撤銷到地3次提交后、使用git log查看歷史版本會發現,實際上這裏第6次提交,只是内容與地3次相同罷了

1
git revert 版本號 | HEAD
tips

儅我們使用git revert HEAD時,會撤銷回上一次操作,這裏的上一次指的是git reflog中的上一次

經典的小問題

  1. 來自https://cloud.tencent.com/developer/article/1413097

    簡述一下就是小白目前提交到了第6次,但是不小心使用git reset --hard回滾到了第1次,同時有進行了一次提交一共7次,問如何把前5次恢復,同時保留剛剛提交的第7次

    1
    2
    3
    4
    5
    6
    git reflog
    # 查看歷史操作
    git reset --hard 第6次提交的版本號
    # 回滾到第6次提交的地方
    git cherry-pick 第7次提交的版本號
    # 解決衝突並添加第7次

分支管理

分支管理可以説是git一個非常非常强大的功能了,以下是主要相关命令

1
2
3
git branch
git checkout
git merge

git branch

git branch可以列出,創建或刪除分支

1
2
3
4
5
6
7
8
9
10
11
12
git branch
# 列出目前分支,帶星號的表示當前所在分支
git branch -r
# 僅列出遠程分支
git branch -a
# 列出所有分支
git branch 新分支名
# 創建新分支
git branch -d 分支名
# 刪除分支
git branch -m 原分支名 新分支名
# 修改分支名

git checkout

git checkout可以用于切換分支或還原工作樹文件

1
2
3
4
5
6
7
8
git checkout 分支名
# 切換分支
git checkout -b 分支名
# 創建並切換分支
git checkout -- 文件名
# 撤銷該文件在工作區的修改
git checkout HEAD^
# 切換到上一次提交
git switch

2.27.0及往後版本中,你可以使用git switch來切換分支(我電腦中的版本太老了不支持)

1
2
3
4
git switch 分支名
# 切換分支
git switch -c 分支名
# 創建並切換分支

git merge

git merge可以將兩個或多個版本合并在一起

1
2
git merge 分支名
# 將該分支與當前分支合并

git reset —hard

關於 分支衝突
  1. 手動解決

    1
    2
    3
    4
    5
    <<<<<<< 當前分支名
    不同的内容a
    =======
    不同的内容b
    >>>>>>> 想要合并的分支名

    兩個内容選擇一個留下

使用ssh密鑰進行無密碼提交

由於使用https進行提交的話可能每次都需要輸入賬戶和密碼,所以我們可以使用ssh密鑰進行面密碼提交

1
2
3
4
5
6
7
8
# 生產ssh密鑰
ssh-keygen -t rsa -C "你的郵箱"
# 之後連續按三下會車
# 查看密鑰
cat ~/.ssh/id_rsa.pub
# 之後把密鑰添加到遠程對應的位置
# 進行測試,我這裏使用的是gitee
ssh -T git@gitee.com

若返回Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access. 内容,則表示添加成功。