Git 5条提高效率的命令

2023-09-24 14:18:52 浏览数 (2)

stash

官方解释:当您想记录工作目录和索引的当前状态,但又想返回一个干净的工作目录时,请使用git stash。该命令将保存本地修改,并恢复工作目录以匹配头部提交。

stash 命令能够将还未 commit 的代码存起来,让你的工作目录变得干净

代码语言:javascript复制
git stash # 保存起来
git stash apply # 释放出来

# 保存当前未commit的代码并添加备注
git stash save "备注的内容"

# 列出stash的所有记录
git stash list

# 删除stash的所有记录
git stash clear

# 应用最近一次的stash
git stash apply

# 应用最近一次的stash,随后删除该记录
git stash pop

# 删除最近的一次stash
git stash drop

应用场景:

  1. 1. 突然有个紧急的任务,但当前分支代码写到一半,还有bug没处理,保存又怕到时忘记处理,先暂存起来。
  2. 2. 本来是B任务的修改,结果切换分支搞错了,在A分支修改了,可以直接暂存起来,切换到B分支再释放出来。

reset --soft

完全不接触索引文件或工作树(但会像所有模式一样,将头部重置为)。这使您的所有更改的文件更改为“要提交的更改”。

回退你已提交的 commit,并将 commit 的修改内容放回到暂存区。

一般我们在使用 reset 命令时,git reset --hard 会被提及的比较多,它能让 commit 记录强制回溯到某一个节点。而 git reset --soft 的作用正如其名,--soft (柔软的) 除了回溯节点外,还会保留节点的修改内容。

代码语言:javascript复制
git init
echo 'first update' >> a.txt
git add .
git commit -m 'first update'

echo 'second update' >> a.txt
git add .
git commit -m 'second update'

查看一下日志

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git log
commit 0175ac083b7b35d95834718a1bf59fd72be46733 (HEAD -> master)
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:08:26 2023  0800

    second update

commit 87770d53544d5dd5f1192798f7109704e0620874
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:08:26 2023  0800

    first update

--hard测试

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git reset --hard 87770d53544d5dd5f1192798f7109704e0620874
HEAD is now at 87770d5 first update
(base) xj@xjtest:~/temp/0912$ git log
commit 87770d53544d5dd5f1192798f7109704e0620874 (HEAD -> master)
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:08:26 2023  0800

    first update

注意这里,--hard退回之后,新的修改都全没有了。

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git status
On branch master
nothing to commit, working tree clean

--soft测试

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git reset --soft HEAD^ # 恢复最近一次 commit
(base) xj@xjtest:~/temp/0912$ git log
commit 87770d53544d5dd5f1192798f7109704e0620874 (HEAD -> master)
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:08:26 2023  0800

    first update

注意这里,--soft退回之后,新的修改还有保留

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   a.txt

cherry-pick

给定一个或多个现有提交,应用每个提交引入的更改,为每个提交记录一个新的提交。这需要您的工作树清洁(没有从头提交的修改)。

将已经提交的 commit,复制出新的 commit 应用到分支里

应用场景

commit 都提交了,为什么还要复制新的出来?

应用场景:有时候版本的一些优化需求开发到一半,可能其中某一个开发完的需求要临时上,或者某些原因导致待开发的需求卡住了已开发完成的需求上线。这时候就需要把 commit 抽出来,单独处理。

代码语言:javascript复制
git init
git checkout -b master
echo 'init' >> a.txt
git add .
git commit -m 'master commit1'

git checkout -b branch1
echo 'first' >> a.txt
git add .
git commit -m 'first update' 

echo 'second' >> a.txt
git add .
git commit -m 'second update' 

echo 'Third' >> a.txt
git add .
git commit -m 'Third update' 
git log

查看历史

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git log
commit c5d72ee84f7e2a92198269b262715eef4a131fba (HEAD -> branch1)
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:34:14 2023  0800

    Third update

commit a2dd8ac380f0110629a7aa42727ea6947da56cb6
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:34:14 2023  0800

    second update

commit e1752f2b9c0c0eba6752418e35df9e06d1c53ca0
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:34:14 2023  0800

    first update

commit 9ad46c4a1dd339e966a9981899dc4206dc1d15e3 (master)
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:34:03 2023  0800

    master commit1

切换到新的分支

代码语言:javascript复制
git checkout master
git checkout -b branch2

把旧的分支上某个commit释放到新的分支上

代码语言:javascript复制
git cherry-pick a2dd8ac380f0110629a7aa42727ea6947da56cb6

herry-pick 代码冲突

cherry-pick 多个commit时,可能会遇到代码冲突,这时 cherry-pick 会停下来,让用户决定如何继续操作。

revert

给定一个或多个现有提交,恢复相关提交引入的更改,并记录一些这些更改的新提交。这就要求你的工作树是干净的(没有来自头部的修改)。

应用场景:有一天测试突然跟你说,你开发上线的功能有问题,需要马上撤回,否则会影响到系统使用。这时可能会想到用 reset 回退,可是你看了看分支上最新的提交还有其他同事的代码,用 reset 会把这部分代码也撤回了。由于情况紧急,又想不到好方法,还是任性的使用 reset,然后再让同事把他的代码合一遍(同事听到想打人),于是你的技术形象在同事眼里一落千丈。

代码语言:javascript复制
git init
git checkout -b master

echo 'first' >> a.txt
git add .
git commit -m 'first update' 

echo 'second' >> a.txt
git add .
git commit -m '你的提交' 

echo 'Third' >> a.txt
git add .
git commit -m '小伙伴的提交' 
代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git log
commit 0aa72921f5ebeb4105beee0dac7be4b6fc6f35cd (HEAD -> master)
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:40:11 2023  0800

    小伙伴的提交

commit 1eaa40f8a26db5caf85b8c0d7cd419c57e90695e
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:40:11 2023  0800

    你的提交

commit 2e2ddf0ca4b86204b0361f6a44b84c549f77b6eb
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:40:11 2023  0800

    first update

revert 掉自己提交的 commit

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git revert 1eaa40f8a26db5caf85b8c0d7cd419c57e90695e
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
error: could not revert 1eaa40f... 你的提交
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

reflog

如果说 reset --soft 是后悔药,那 reflog 就是强力后悔药。它记录了所有的 commit 操作记录,便于错误操作后找回记录。

应用场景

应用场景:某天你眼花,发现自己在其他人分支提交了代码还推到远程分支,这时因为分支只有你的最新提交,就想着使用 reset --hard,结果紧张不小心记错了 commitHash,reset 过头,把同事的 commit 搞没了。没办法,reset --hard 是强制回退的,找不到 commitHash 了,只能让同事从本地分支再推一次(同事瞬间拳头就硬了,怎么又是你)。于是,你的技术形象又一落千丈。

代码语言:javascript复制
git init
git checkout -b master

echo 'first' >> a.txt
git add .
git commit -m 'first update' 

echo 'second' >> a.txt
git add .
git commit -m 'second update' 

echo 'Third' >> a.txt
git add .
git commit -m 'Third update' 

查看历史记录

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git log
commit 35c16d86da2691a96133081e70658f01e272daaa (HEAD -> master)
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:45:46 2023  0800

    Third update

commit 9b2777e045901e9d8c01ea6f322253026a0ab7fa
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:45:46 2023  0800

    second update

commit fcbdc19704b8d74256c8e6e881e53ce97a520cfe
Author: xj <xj@example.com>
Date:   Tue Sep 12 19:45:46 2023  0800

    first update

现在你想回到second update,结果copy错误,回到了first update,还关闭了命令行窗口

代码语言:javascript复制
git reset --hard fcbdc19704b8d74256c8e6e881e53ce97a520cfe

用reflog查看commit

代码语言:javascript复制
(base) xj@xjtest:~/temp/0912$ git reflog
fcbdc19 (HEAD -> master) HEAD@{0}: reset: moving to fcbdc19704b8d74256c8e6e881e53ce97a520cfe
35c16d8 HEAD@{1}: commit: Third update
9b2777e HEAD@{2}: commit: second update
fcbdc19 (HEAD -> master) HEAD@{3}: commit (initial): first update

回到想要的commit

代码语言:javascript复制
git reset --hard 35c16d8

我有个大胆的想法

小伙伴在平常有没有遇到以下这种情况:遇到技术难题时,网上教程一堆堆,优秀的很多,但也有很多是过时的,或者是copy来copy去,甚至错别字都没改。

我公众号的技术文章,都是亲自校验过的。至少可以保证在发文的一段时间,不会过时。如果你在实操过程中,有遇到问题,可以在同名公众号留言,免费解答,相互学习,相互成长^v^

0 人点赞