Git 在工作中的使用

207 阅读7分钟

前奏

git 命令在工作中是不可缺少的一部分,除了一些最基本的命令以外,小柒在这边文章将介绍其他 git 的常用命令,包括一些急救的小技巧。

远程管理

git remote add ( name  url ) // 添加远程仓库
git remote set-url (url)// 更改远程仓库的url
git remote rename ( oldName newName ) // 重命名远程仓库名
git remote rm  (name) // 删除远程仓库
git remote -v  // 查看现有远程

分支管理

  • 拉取远程分支并创建本地分支

     git checkout -b 本地分支名 origin/远程分支名 
     或者
     git fetch origin <branch-name>:<local-branch-name>
    
  • 查看分支

     git branch // 本地
     git branch -r // 远程
     git branch -a // 全部 
    
  • 删除分支:

     git branch -d  xx // 本地
     git push origin -d xx // 远程
     git branch | grep -v "master" | xargs git branch -D // 删除 master 以外的本地分支 
    
  • 修改分支名

    git branch -m oldName newName // 本地分支重命名(还没有推送到远程) 
    git push --delete origin oldName // 删除远程分支
    git push origin newName // 上传新命名的本地分支
    git branch --set-upstream-to origin/newName // 把修改后的本地分支与远程分支关联 
    

分支合并

  • git rebase

    git rebase 让你的提交记录更加清晰可读。

    rebase 的提交记录很清晰,如果合并过程中有冲突需要手动解决,然后依次使用 git addgit rebase --continue 的方式来解决冲突,或者使用 git rebase --skip 来跳过这次rebase。

  • git merge

    git merge 与 git rebase 的不同的地方是,merge 会产生一个合并记录,如 Merge branch 'xxx into 'xxx' 这样的提交信息。其次在解决冲突的时候,只需要解决一次就好。

commit 管理

  • 查看某次 commit

    git show xx // hash
  • 差异比较

    git diff // 比较工作区与缓存区
    git diff HEAD // 比较工作区与最近一次的提交
    git diff id id  // 比较两个提交
    
  • 遗漏的文件补交

    git add missed-file // missed-file 为遗漏提交文件
    git commit --amend --no-edit // --no-edit 表示不需要修改 message
    git commit --amend -m 'xxx' // 如果要修改上一次的 commit 信息,不需要携带 --no-edit 参数
    
  • 使用 rebase 的交互模式重写提交历史

    rebase 的交互模式通常是同一个分支上对提交的历史进行修改,比如合并 commit、删除 commit、交换两个 commit 的顺序等。(不建议在远程上使用 rebase)

    git rebase -i <base-commit>  //  对 base-commit之后的提交做操作
    git rebase -i 4bdd11e  e5db3cc // 前开后闭的区间
    git rebase -i HEAD~6  // 查看最近6次提交记录,选择对哪一条记录进行修改
    ​
    上面的命令会进入到如下的编辑器界面。
    #
    # 命令:
    # p, pick <提交> = 使用提交
    # r, reword <提交> = 使用提交,但修改提交说明
    # e, edit <提交> = 使用提交,进入 shell 以便进行提交修补
    # s, squash <提交> = 使用提交,但融合到前一个提交
    # f, fixup <提交> = 类似于 "squash",但丢弃提交说明日志
    # x, exec <命令> = 使用 shell 运行命令(此行剩余部分)
    # b, break = 在此处停止(使用 'git rebase --continue' 继续变基)
    # d, drop <提交> = 删除提交
    
  • 获取指定的 commit 进行合并

    git cherry-pick [commit-hash]
    

    比如 master 上需要合并两个分支的某一次提交,找到这两次提交的hash_id,依次执行以下两条指令 git cherry-pick 950ec038git cherry-pick 45165ca5,在过程中如果出现冲突,解决冲突后进行 git add,接着执行 git cherry-pick --continue,最后 master 上的提交并将这两次提交合并了。

暂存文件

这种场景一般发生在两个分支的切换下。如当在 fix-bug分支下修复某个bug,修复 bug 的代码还没写完此时又要切换到另一个分支下去编写代码,此时如果不想提交当前代码,就要将代码先暂存在暂存区,再去切换分支。

git stash // 暂存本地的改动
git stash save "message" // 暂存并添加备注 
git stash pop // 应用最近一次暂存的修改,并删除暂存的记录
git stash apply stash@{$num}  // 应用某个存储,但不会把存储从存储列表中删除:
git stash list // 查看当前有哪些存储
git stash drop stash@{num}  // 删除某个暂存   
git stash clear // 删除所有暂存

回滚代码

对于个人分支: 我们可以使用 git reset 命令 + git push -f origin xx 来回退代码。

对于多人协助的分支:我们可以使用 git revert 命令进行撤回提交。

git rest

  • 撤销 commit

    git reset --mixed HEAD^ 所有的提交的文件都会在工作区中(修改不会丢失)
    
  • 撤销 commit

    git reset --soft HEAD^ 所有的提交的文件都会在缓存区中(修改不会丢失)
    
  • 回退到某个commit:

    git reset --hard b76efad :修改版本库,修改暂存区,修改工作区(丢失之前的所有提交)
    
  • 远程回退:本地回退之后强推 git push -f origin xxx

注意 --mixed、 --soft和 --hard 的区别是:--mixed 的文件会在工作区;--soft 的文件会在缓存区;--hard 的文件会丢失。

git revert

新生成一个提交节点。

git revert commitId  // 将某一次的提交恢复
git revert [commit-id1] [commit-id2]  // 回滚多次的提交(前开后闭)

^ 与 ~ 的区别

HEAD表示当前版本,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ , 当然往上n个版本写n个^比较容易数不过来,可以写成HEAD~n。

急救恢复

git reflog

是一种用来记录本地仓库分支顶端的更新机制,它会记录所有分支顶端曾经指向的提交。是一个很好的用来恢复本地错误操作的命令。很多时候git log 显示的提交是找不到我们想要的那条记录,比如错误地reset了一个旧的提交,或者错误的rebase,或者删除某个分支之后,想要找回这个分支上的代码等...。

以上这些情况我们都可以使用 git reflog 查看,找到错误的 commit,使用 git reset --hard xxx 重置到改记录之前,本地的 git 状态就会恢复该记录之前的状态。

注意:如果需要更全面的操作记录信息 可以使用 git log -g 打印出全面的日志信息。

git fsck

用来检查内部数据库的问题或者不一致性。

git reflog 可以帮我们找回大部分操作,但如果在 reflog 中都找不到的 commit,说明这个commit 没有记录在 .git/logs/ 文件里,这种情况可以使用 git fsck --full 命令。比如 stash 的内容没有提交,被清掉了有想要找回就可以使用 git fsck 命令。

git fsck --lost-found // 可以找到丢掉的提交
git fsck --full // 显示所有没有被其他对象指向的对象

image.png

可以通过 git show [commit hash]查看是否是需要恢复的提交,使用 git merge [commit hash] 来恢复之前的提交。

git bisect

一种二分查找方式:定位开始导致错误代码的 commit。

  • 确定没有问题的提交,复制其 hash值
  • 开始调试 git bisect start
  • 告诉 git 当前的提交是否有问题(git bisect bad or git bisect good)
  • 循环,直到 hash 值不会变化,就定位了哪次提交导致问题了
  • 结束调试 git bisect reset

image.png

git alias

命令行的形式: git config --global alias.<简化的字符> 原始命令。

git config --global alias.ck checkout

除了修改命令行以外,还可以通过修全局的.gitconfig 文件来设置。Git 配置文件是 .gitconfig: 在 users 目录下使用 open .gitconfig 打开,通过修改这个文件的 alias 项来设置别名。

image.png

实际场景

  • 本地分支和远程分支都被删除了怎么办?

    直接 git reflog,找到删除分支之前的一次提交记录,git reset 就好。

  • 只是 add 了,但没有commit,一不小心 reset 了add 的内容?

    使用 git fsck 命令。

  • Stash 的内容不小心清掉了

    使用 git fsck 命令。