git 有一些使用频率不是很高,但是根据实际情况的发生,又很实用的命令,整理如下:
多行commit信息
用法示例:
git commit -m 'update: 打包优化' -m 'update: stats to minimal'
效果如下:
Author: vavid
Date: Fri Jul 10 14:10:16 2020 +0800
update: 打包优化
update: stats to minimal
修正 commit
一次 commit 后,未 push 之前,发生了改动较少信息的情况,比如修正个别文案,注释等,目的是为了减少 commit 记录,用修正的这次 commit 覆盖上次的 commit
$ git add .
$ git commit -m 'update: 模块'
...
//紧接着,你改了几个字
...
$ git commit --amend -m 'update: 完善模块'
$ git push
注意:push 之后不建议使用 amend
去commit,因为会与上一次 commit 产生冲突,但是也有解决办法,继续往下看
撤销 commit
前提:已经 commit 但未 push,若已经 push ,别急,先看这条,然后看下一条
首先要了解:
--mixed // 默认,保留工作内容,并且清空暂存区
--hard // 改动的工作内容直接丢弃,谨慎使用
--soft // 工作内容保留在暂存区
注意:保留工作内容的情况,是为了方便基于保留的内容继续做修改,但是撤销下来的内容确认是不需要的,这时要手动做丢弃。
比如要撤销最近一次的 commit ,有以下三种等价写法:
// 改动的内容直接丢弃|保留在暂存区
git reset [--hard|--soft] HEAD~1
git reset [--hard|--soft] HEAD^
git reset [--hard|--soft] {SHA-1}
再比如要撤销最近两次修改
git reset [--hard|--soft] HEAD~2
git reset [--hard|--soft] HEAD^^
git reset [--hard|--soft] {SHA-1} // 这里的SHA-1要取倒数第三次的
注意: a. 最后一种写法适合撤销最近的修改的次数较多的情况,指的是撤销从 {SHA-1} 这次提交之后所有提交;
b. 使用 reset 撤销HEAD指针会向后移动
还可以使用变基,了解一下
git rebase -i HEAD^^ // 同理,参考以上写法进行拓展
git rebase --onto HEAD^^ HEAD^ feature1
已经 push 完,修正或者撤销 commit
这种情况分两步走:
第一步,先按照上面修正或者 撤销 commit 的方式操作完
第二步,不要慌,然后强行 push 👉 git push -f
git push origin {目标分支} -f // -f 是 --force (暴力,强迫)
注意:如果该分支是你独立的开发分支,那没有任何问题;如果是多人合作的开发分支,因为有强制更新的操作,所以要先确认在你强制 push 之前的一瞬间,其他人没有 push 过他自己最新的代码。
还有另外一种撤销操作 revert
git revert HEAD // 撤销最近的一次commit,然后push
git revert HEAD^ // 撤销倒数第二次提交,然后push
git revert {SHA-1} // 先 git reflog 找到你要撤销的那次的 sha1 码(可只写前几个字母),然后push
reset
和 revert
的区别
- reset 一次 commit 之后,HEAD 会向后移动,如果之前已经push过,那么 reset 之后查看 git status 或者 git commit 时会提示
(use "git pull" to update your local branch)
,git push 会提示
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g. 'git pull ...') before pushing again.
确认好撤销动作后,强行push(见上)到远程即可。
- revet 一次 commit 之后,HEAD 是向前的,相当于反向再增加一次操作记录,多用于撤销某一次提交记录的情况;
暂存
一些情况我们需要用到暂存 git stash
暂存文件时,添加备注,以便于区分:
git stash save "备注描述"
但是,未被 track 的文件不会被暂存,导致暂存 git stash 不生效,有一个办法:
git stash -u // -u 是 --include-untracked 的缩写
将某条stash记录应用到仓库中(stash记录仍然在):
git stash apply // 最新的一条stash
git stash apply stash@{$num} // 指定某一条stash记录
将某条stash记录弹出到仓库中(stash记录消失):
git stash pop // 最新的一条stash
git stash pop stash@{$num} // 指定某一条stash记录
删除某条暂存:
git stash drop stash@{$num}
取消合并
比如合并错分支,想取消合并的情况:
git merge --abort
修改分支名称
比如要将分支名 feature1
改为 feature2
git branch -m feature1 feature2 // 对分支 `feature1` 重命名为 `feature2`
git push --delete origin feature1 // 删除远程的 `feature1` 分支
git push origin feature2 // 将 `feature2` 推送到远程
git branch --set-upstream-to origin/feature2 // 把修改后的本地分支 `feature2` 与远程分支 `feature2` 关联
删除分支
一个分支feature1
完成上线并合并到主分支后,想删除的情况:
git branch -d feature1 // 只删除本地
git branch origin -d feature1 // 删除本地+远程
一个分支feature1
未完成,未合并到主分支,删除的时候 git 会给出警告,但就是想直接废弃的情况:
git branch -D feature1 // -D 强制删除
耶?分支删除了又想恢复的情况怎么办?
$ git reflog
...
找到被删除前的那次 commit 记录的 sha1码(如:c08de9a ......)
$ git checkout c08de9a // 切到这次 commit
$ git checkout -b {新分支名称} // 重新创建一个分支
查看记录
git reflog
想要查看每个 commit 的改动细节的情况:
git log -p // -p 是 -patch 的缩写
想要查看每个 commit 的改动大概的情况:
git log --stat
想要查看某个 commit 的具体改动的情况:
git show {SHA-1} // 要指定某一个文件查看,后面再加上文件名
强制合并分支
有些时候,目标分支 master 有优先于你本地的 commit 记录,但是这些 commit 并没有太大意义,如果你想将你的分支 feature1
强制合并到目标分支 master,先切换到目标分支 master,然后
git push origin {feature1}:master -f
这时候你的分支 feature1
的最新改动会被合并到 master
分支,但是你本地的 commit 仍然和远程 master 分支有差距,因此不能直接用 git pull(会提示有冲突需要解决),而要用
git fetch --all //下载远程仓库最新内容,不做合并
git reset --hard origin/master //把HEAD指向master最新版本
变基 rebase
给当前的的 commit 序列重新设置基础点,相当于在目标分支合并多个 commit,目的是为了分支清晰好管理
$ git checkout feature1
$ git rebase {目标分支} // 需要在feature1分支执行rebase
$ git checkout {目标分支}
$ git merge feature1
取消 rebase
git rebase --abort
几个 git 技能点
-
tag
tag
与branch
最大的区别是不能移动,所以通常用在关键版本打标记
比如将当前分支标记为:v1.0,并且增加一些对这个标记的描述信息:add tags information
$ git tag v1.0 -m "add tags information"
$ git push --tags
更多tag相关操作详见:git tag的基本用法
-
cherry-pick
可以将某一分支的某一次提交合并进来
git cherry-pick {SHA-1}
更多 cherry-pick 详见
git cherry-pick的使用
https://git-scm.com/docs/git-cherry-pick
网友评论