美文网首页
git 一些实用命令

git 一些实用命令

作者: vavid | 来源:发表于2020-04-02 10:28 被阅读0次

    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 一些实用命令

          本文链接:https://www.haomeiwen.com/subject/wlitphtx.html