禅道博客

分享专业技术知识,文章内容干货满满

Git飞行手册

2022-11-04 13:21:40
周鑫
原创 91
摘要:作者通过本文与大家分享关于Git飞行规则的问题和学习心得。

Git飞行规则

什么是“飞行规则”

飞行规则(Flight Rules)  是记录在手册上的来之不易的一系列知识,记录了某个事情发生的原因,以及怎样一步一步的进行处理。本质上,,它们是特定场景的非常详细的标准处理流程。

我刚才提交了什么?

git show
                
git log -n1 -p
                


我的提交信息写错了

如果提交信息写错了且这次提交还没有push。

git commit --amend --only
                
git commit --amend --only -m 'xxxxxxx'
                


我提交的用户名和邮箱不对。

git commit --amend --author "New Authorname "
                


我想从一个提交里移除一个文件。

git checkout HEAD^ myfile
git add -A
git commit --amend
                


我想删除我的的最后一次提交

如果你需要删除push了的提交。

git reset HEAD^ --hard
git push -f [remote] [branch]
                

如果你还没有推到远程, reset到最后一次提交前的状态。

git reset --soft HEAD@{1} 
                

如果已经push了, 唯一安全的是 git revert SHAofBadCommit


删除任意提交

尽量不要这么做。

git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
git push -f [remote] [branch]
                


我意外的做了一次hard reset,我想找回我的内容。

git reflog
                
git reset --hard SHA1234
                


暂存

我需要把暂存的内容添加到上一次的提交。

git commit --amend
                


我想要暂存一个新文件的一部分,而不是这个文件的全部。

git add --patch filename.x
                

-p  会打开交互模式, 你将能够用 s  选项来分隔提交(commit); 然而, 如果这个文件是新的, 会没有这个选择, 添加一个新文件时。

git add -N filename.x
                

然后, 你需要用 e  选项来手动选择需要添加的行,执行 git diff --cached  将会显示哪些行暂存了哪些行只是保存在本地。


我想把在一个文件里的变化(changes)加到两个提交里

git add  会把整个文件加入到一个提交. git add -p  允许交互式的选择你想要提交的部分。


未暂存的内容

我想把未暂存的内容移动到一个新分支

git checkout -b my-branch
                


我想把未暂存的内容移动到另一个已存在的分支

git stash
git checkout my-branch
git stash pop
                


我想丢弃本地未提交的变化

如果你只是想重置源(origin)和你本地(local)之间的一些提交,你可以:

# one commit
git reset --hard HEAD^
# two commits
git reset --hard HEAD^^
# four commits
git reset --hard HEAD~4
# or
git checkout -f
                

重置某个特殊的文件, 用文件名做为参数:

$ git reset filename
                


分支

我从错误的分支拉取了内容,或把内容拉取到了错误的分支

git reflog
ab7555f HEAD@{0}: pull origin wrong-branch: Fast-forward
c5bc55a HEAD@{1}: checkout: checkout message goes here
                

重置分支到所需的提交

git reset --hard c5bc55a
                


我想扔掉本地的提交,以便我的分支与远程的保持一致

git status  会显示你领先源多少个提交:

git status
# On branch my-branch
# Your branch is ahead of 'origin/my-branch' by 2 commits.
#   (use "git push" to publish your local commits)
#
                
git reset --hard origin/my-branch
                


我需要提交到一个新分支,但错误的提交到了main

在main下创建一个新分支,不切换到新分支,仍在main下:

git branch my-branch
                

把main分支重置到前一个提交:

git reset --hard HEAD^
                

或者, 如果不使用 HEAD^ , 找到想重置到的提交的hash(git log  ), 然后重置到这个hash。 使用git push  同步内容到远程。

例如, main分支想重置到的提交的hash为a13b85e:

git reset --hard a13b85e
HEAD is now at a13b85e
                

checkout刚才新建的分支继续工作:

git checkout my-branch
                


我不小心删除了我的分支

如果定期推送到远程, 多数情况下应该是安全的,但有些时候还是可能删除了还没有推到远程的分支。

先创建一个分支和一个新的文件:

git checkout -b my-branch
git branch
touch foo.txt
ls
README.md foo.txt
                

添加文件并做一次提交。

git add .
git commit -m 'foo.txt added'
(my-branch)$ foo.txt added
 1 files changed, 1 insertions(+)
 create mode 100644 foo.txt
git log
commit 4e3cd85a670ced7cc17a2b5d8d3d809ac88d5012
Author: siemiatj 
Date:   Wed Jul 30 00:34:10 2014 +0200
    foo.txt added
commit 69204cdf0acbab201619d95ad8295928e7f411d5
Author: Kate Hudson 
Date:   Tue Jul 29 13:14:46 2014 -0400
    Fixes #6: Force pushing after amending commits
                

现在我们切回到主分支,不小心的’删除my-branch 分支。

git checkout main
Switched to branch 'main'
Your branch is up-to-date with 'origin/main'.
git branch -D my-branch
Deleted branch my-branch (was 4e3cd85).
echo oh noes, deleted my branch!
oh noes, deleted my branch!
                
git reflog
69204cd HEAD@{0}: checkout: moving from my-branch to main
4e3cd85 HEAD@{1}: commit: foo.txt added
69204cd HEAD@{2}: checkout: moving from main to my-branch
                
git checkout -b my-branch-help
Switched to a new branch 'my-branch-help'
git reset --hard 4e3cd85
HEAD is now at 4e3cd85 foo.txt added
ls
README.md foo.txt
                


我想删除一个分支

删除一个远程分支。

git push origin --delete my-branch
                

也可以。

git push origin :my-branch
                


Rebasing 和合并

我想撤销rebase/merge

当完成不了一个进行中的rebase/merge,Git 在进行危险操作的时候会把原始的HEAD保存在一个叫ORIG_HEAD的变量里。

git reset --hard ORIG_HEAD
                


安全合并策略

--no-commit  执行合并但不自动提交, 给用户在做提交前检查和修改的机会。 no-ff  会为特性分支的存在过留下证据, 保持项目历史一致。

git merge --no-ff --no-commit my-branch
                

我需要将一个分支合并成一个提交。

git merge --squash my-branch
                


检查是否分支上的所有提交都合并过了

在这些分支的head(或任何 commits)之间做一次diff。

git log --graph --left-right --cherry-pick --oneline HEAD...feature/120-on-scroll
                

另一个做法。

git log main ^feature/120-on-scroll --no-merges
                


Stash

暂存所有改动。

git stash
                

-u 排除一些文件。

git stash -u
                


暂存指定文件

git stash push working-directory-path/filename.ext
                
git stash push working-directory-path/filename1.ext working-directory-path/filename2.ext
                


暂存时记录消息

这样你可以在list 时看到它。

git stash save 
                

或。

git stash push -m 
                


使用某个指定暂存

git stash list
                
git stash apply "stash@{n}"
                

暂存时保留未暂存的内容

手动create一个stash commit , 然后使用git stash store

git stash create
git stash store -m "commit-message" CREATED_SHA1
                    

点此下载《Git飞行规则

发表评论
评论通过审核后显示。