DevOps系列文章之 Git知识大全

思考:

git merge 与 git rebase 的区别是?

  • rebase会合并该分支与其他分支的commit history,可能会得到一个新的commit history
  • rebase得到更简洁的项目历史,去掉了merge commi,如果合并出现代码问题不容易定位,因为re-write了commit history
  • merge会创建新的commit,包括每个分支的commit 详情
  • 每次merge会自动产生一个merge commit,特别是commit比较频繁时,看到分支很杂乱。
  • 想要得到一个干净的,没有merge commit的线性commit历史记录,选择git rebase
  • 想要得到一个完整的commit历史记录,且想避重写commit历史记录的风险,选择git merge

git reset 与 git rebase的区别?

  • git revert会生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留,也就是说对于项目的版本历史来说是往前走的。
  • git reset 则是回到某次提交,类似于穿越时空。

实践操作

  • 获取Git仓库

    • 现有文件目录使用git init初始化仓库
    • 从远程服务器上克隆git clone一个仓库
  • 合并其它分支的代码

    • git merge
    • git rebase
  • 撤销合并merge/rebase

    • git reset --hard [commit] 工作区、暂存区撤回到制定的commit版本
    • git reset --merge [commit] 或者 git reset --merge HEAD^ 撤回到合并前的commit
  • 修改某次的commit

    • git commit -amend -m 'comment' 替换上一次的commit
    • git rebase -i HEAD~[数字n] 进入vim编辑器,并显示最近n条最新的commit记录
  • 撤销某次的commit

    • git revert HEAD 产生新一次commit来抵消上一次提交

    • git revert commit_id 撤销中间某次commit

    • git revert -m commit_id 撤销其他分支合过来的commit

    • git revert --no-commit commit1..commit5 撤销commit1(不包括)至commit5之间的连续commit

      git revert的参数:

      --no-edit:执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息。

      --no-commit:只抵消暂存区和工作区的文件变化,不产生新的提交。

  • 丢弃某次commit

    • git reset [last good SHA] 丢弃掉某个提交之后的所有提交,在提交历史中彻底消失
    • git reset --hard [last good SHA] --hard参数可以让工作区里面的文件也回到以前的状态
  • 查看提交历史记录

    • git log 时光机,查看refs的HEAD的指向变动
  • 查看文件的改动

    • git diff 对比工作区与暂存区的同文件, 未添加至暂存区的文件改动
    • git diff --staged/cached查看添加至暂存区所有文件的内容修改
    • git stage 显示工作目录和暂存区的状态
  • 暂存文件的改动

    • git stash 临时保存和恢复工作区文件的改动
  • 撤销文件的改动

    • git checkout -- [filename]
  • 撤销暂存区的文件

    • git rm --cache [filename]

你可能感兴趣的:(git)