git 一些实用命令

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

resetrevert 的区别

  1. 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(见上)到远程即可。

  1. 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 技能点

  1. tag
    tagbranch 最大的区别是不能移动,所以通常用在关键版本打标记
    比如将当前分支标记为:v1.0,并且增加一些对这个标记的描述信息:add tags information
$ git tag v1.0 -m "add tags information"
$ git push --tags

更多tag相关操作详见:git tag的基本用法

  1. cherry-pick
    可以将某一分支的某一次提交合并进来
 git cherry-pick {SHA-1}  

更多 cherry-pick 详见
git cherry-pick的使用
https://git-scm.com/docs/git-cherry-pick

链接 git 简易指南

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 一、基本概念: 注:对于git的分布式概念及其优点,不重复说明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大厂offer阅读 1,425评论 0 3
  • 查看 Git 配置 $ git config用来配置或读取相应的工作环境变量。 配置用户信息 $ git conf...
    thelastcookies阅读 420评论 0 0
  • 今天陪伴女儿一起在家里填了一个成长胜率表,嗯,我告诉我女儿说我说,这张表上面有你想要的百宝箱,你想要什么都可以在这...
    多福多财渝皓阅读 201评论 0 0
  • 过去的一周我带着我得28寸大箱子和一个大单肩包住进了上海的一家青旅,住过几天带卫生间的四人间,也住过只有公共卫生间...
    程若若阅读 839评论 9 8
  • 明年九月初拿着云南师范大学的研究生录取通知书报道,他送的我,帮我报道。带着我的行李,帮我铺床,和我一起收拾东西。我...
    菲菲的心窝阅读 127评论 0 0