git速通

在线学习 git: https://learngitbranching.js.org/?locale=zh_CN

git 配置

  • 最小配置
git config --global user.name '用户'  
git config --global user.email '用户email'  
git config --local   //local 只对指定仓库有效
git config --global  //global 对当前用用户所有的仓库有效
git config --system  //system 对系统所有登录的用户有效

显示config 的配置,加 --list

git config --list --local 
git config --list --global
git config --list --system

–local 要在某个仓库中生效,local优先级高于global

命令

在这里插入图片描述

  • 创建仓库 git init [项目名称]

  • 查看git状态 git status

  • 添加文件到暂存区 git add 文件

  • 工作区文件直接添加到版本区 git commit -am '消息'

  • 提交暂存区文件到历史版本 git commit -m '变更原因'

  • 给受git管理的文件重命名 git mv oldName newName

  • 查看历史版本 git log [-n4] [--online] [--all] [--graph] --oneline 信息简短展示 -n4 最近4次提交 --all 所有分支 --graph 图形化展示版本关系

  • 本地有多少分支 git branch

  • 切换分支,不存在则创建,可以指定版本创建分支 git checkout [-b] 分支名称 [版本编号]

  • 删除分支 git branch -d 分支名

  • 修改最新的commit的消息 git commit --amend

  • 比较两个指定commit的差异 git diff commitID1 commitID2

  • 比较暂存区和Head的差异 git diff --cached

  • 比较工作区和暂存区的差异 git diff [-- 文件]

  • 暂存区恢复到head一样 git reset HEAD [file...]

  • 工作区的文件恢复为和暂存区一样 git checkout -- [file...]

  • 取消最近的几次提交 git reset --hard

  • 清空暂存区 git reset --hard

  • 删除文件 git rm 文件

  • stash

    • 临时隐藏工作区文件 git stash save '注释'
    • 查看隐藏列表 git stash list
    • 恢复 git stash apply stash@{$num}
    • 移除指定的stash git stash drop stash@{$num}
    • 移除所有stash git stash clear
  • 变基 git rebase -i commitID -i 交互式变基

    • 修改commit消息 r
    • 合并多个连续commit s
    • 合并多个不连续commit 将不连续的放到一起,s
  • 忽略不需要的文件 .gitignore

    • / 文件夹 、 * 通配
  • 备份仓库到本地 git clone

  • 拉取远程仓库 git pull

  • 推送本地到远程仓库 git push [alias]

  • 拉去远端代码,但是不合并 git fetch [alias]

  • 合并到当前分支 git merge 分支

  • 取消合并 git merge --abort

  • 禁止向集成分支执行 push -f 操作 【-f 强制更新】

  • 禁止向集成分支执行变更历史 rebase 操作

常用操作

基础篇

commit

保存提交记录
commit 前分支情况
在这里插入图片描述

git commit

对文件进行修改,并把这些修改表示成一个commit,新生成的c2有一个parent commit C1,代表此次修改是从那裡過來的。
在这里插入图片描述

branch

建立一個名稱為 newImage 的新的 branch。
在这里插入图片描述

git branch newImage

在这里插入图片描述

新的 branch 做一些操作

git commit

在这里插入图片描述

main branch 前進了,但 newImage branch 沒有前進!這是因為我們沒有「在」這個新的 branch 上,這也是為什麼星號(*)會在 main 上。

merge

merge 會產生一個特殊的 commit,它包含兩個唯一 parent commit。一個 commit 如果有兩個 parent commit 的話,那就表示:「我想把這兩個 parent commit 本身及它們的 所有的 parent commit 都包含進來。
在这里插入图片描述

当前分支是在 main 上

git merge bugFix

在这里插入图片描述

main 現在指向一個 commit,這個 commit有兩個 parent commit。假如從 main 開始沿著箭頭向上走,在到達起點的路上會經過所有的 commit。這說明了現在 main 紀錄了對文件的所有修改。

rebase 当前分支变基到指定分支下面

在这里插入图片描述

想要把在 bugfix 所做的修改直接移到 main branch上。使用 rebase 的話,兩個 branch 看起來像是依序按順序進行修改,實際上它們的修改是平行進行的。

git rebase main

在这里插入图片描述

現在 bugFix branch 上的工作在 main branch 的最前端,同時我們也得到了一個更加線性的 commit 順序。

注意,本來的 commit C3 沒有消失(在圖上面呈現陰影),而我們"複製" C3,將它的副本 C3’ 接在 main branch 的後面。

現在唯一的問題是 main branch 還沒有更新;切換到 main branch。接下來就把它 rebase 到 bugFix 上

git checkout main; gti rebase bugFix;

在这里插入图片描述

因為 main branch 是 bugFix 的 parent,所以 git 只是把 main branch 往前移動到 bugFix 上。

进阶篇

分离HEAD

HEAD 是一个reference,它是指向目前所 checkout 的commit,基本上就是你目前所在的commit;
在 commit tree中,HEAD 总是指向最近的一次commit,大部分的指令如果要修改commit tree 的状态,都会先改变 HEAD 所指向的commit。
HEAD 通长指向一个 branch 的名称,当你 commit 的时候,该边了分支的状态,这个变化可以从 HEAD 的改变中看到。

分离HEAD 就是让其指向一个 commit 而不是 branch 的名称,git checkout hash;移动HEAD 到某次提交

相对引用^

如果要在 git 中移動,透過指定 commit 的 hash 值的方式會變得比較麻煩。你不得不用 git log 來查詢 hash 值。

使用相對引用,你可以從一個易於記憶的地方(比如說 branch 名稱 bugFix 或 HEAD)開始工作。

  • 使用 ^ 向上移動一個 commit
  • 使用 ~ 向上移動多個 commit

插入(^)這一個符號。把這個符號接在某一個 reference 後面,就表示你告訴 git 去找到該 reference 所指向的 commit 的 parent commit。
main^ 相當於 “main 的 parent commit”。
main^^ 是 main 的 grandparent commit(往前推兩代)

也可以指定HEAD作为相对引用

git branch -f 分支 引用 让分支指向另一个commit

取消修改

reset 对远程分支是无效的

git reset 把分支的參考點退回到上一個 commit 來取消修改。你可以認為這是在"重寫歷史"。git reset 往回移動 branch,原來的 branch 所指向的 commit 好像從來沒有存在過一樣。
在这里插入图片描述

git reset HEAD~1

在这里插入图片描述

revert 取消修改并且把这个状态分享给别人

在这里插入图片描述

git revert HEAD

在这里插入图片描述

要取消的 commit 後面居然多了一個新的 commit!這是因為新的 commit C2’ 引入了修改——用來表示我們取消 C2 這個 commit 的修改。現在可以把你的修改分享給別人啦。

调整提交顺序

超好用的 cherry-pick

git cherry-pick <Commit1> <Commit2> <...>當你想要複製幾個 commit 並且接在你目前的位置(HEAD)下面的時候,這會是一個非常直接的方式。
在这里插入图片描述

在 side branch 中,我們有一些 commit 想要複製到 main branch 上,這可以透過一個 rebase 來完成;看看 git cherry-pick 怎麼做。

git cherry-pick c2 c4

在这里插入图片描述

我們複製了 C2 以及 C4 並且把它們放到main 的後面

rebase -i 交互式变基

當互動式的 rebase 的對話視窗打開之後,你就可以做到三件事情:

  • 可以藉由改變這些 commit 在 UI 的位置,來重新排序它們的順序。
  • 可以選擇完全忽略掉某些 commit
  • 可以把 commit 合併在一起

在这里插入图片描述

变基当前分支
git rebase -i HEAD~4

在这里插入图片描述

git 根據所選擇的 commit,把它們複製了下來。

活用git指令

修改多次commit之前的消息

方式一:git rebase -i
在这里插入图片描述

  • 先用 git rebase -i 將 commit 重新排序,然後把我們想要修改的 commit 移到最前面
  • 然後用 git commit --amend 來進行一些修改
  • 接著再用 git rebase -i 來將他們按照最開始的順序重新排好
    在这里插入图片描述

方式二:cherry-pick
在这里插入图片描述

git checkout main;

git cherry-pick C2;

git commit --amend;

git cherry-pick C3

在这里插入图片描述

tag

branch 很容易被移動,而且當有新的 commit 時,又會再移動,branch 經常指向不同的 commit,branch 很容易改變。

有沒有什麼方法可以永遠有一個指向 commit 的記號,例如,表示重大的軟體釋出,或者是修正很大的 bug,有沒有其它比 branch 更好的方法,可以永遠地指向這些 commit?

git tag 可以解決這個問題,它們可以永遠地指向某個特定的 commit,就像是表示一個"里程碑"一樣。更重要的是,當有新的 commit 時,它們也不會移動,你不可以 “checkout” 到 tag 上面 commit,tag 的存在就像是一個在 commit tree 上的表示特定訊息的一個錨。
在这里插入图片描述

建立一個 tag,指向 commit C1,表示這是我們第一個版本。

git tag v1 c1

在这里插入图片描述

git describe

因為 tag 在 commit tree 上表示的是一個錨點,git 有一個指令可以用來顯示離你最近的錨點(也就是 tag),而且這個指令叫做 git describe

git describe <ref>

是任何一個可以被 git 解讀成 commit 的位置,如果你沒有指定的話,git 會以你目前所在的位置為準(HEAD)

指令的輸出就像這樣:
__g
表示的是離 最近的 tag, numCommits 是表示這個 tag 離 有多少個 commit, 表示的是你所給定的 所表示的 commit 的前七個 id
在这里插入图片描述

git describe main 會輸出: v1_2_gC2

git describe side 會輸出: v2_1_gC4

ag>__g
表示的是離 最近的 tag, numCommits 是表示這個 tag 離 有多少個 commit, 表示的是你所給定的 所表示的 commit 的前七個 id
在这里插入图片描述

git describe main 會輸出: v1_2_gC2

git describe side 會輸出: v2_1_gC4

猜你喜欢

转载自blog.csdn.net/weixin_46488959/article/details/131148234