git使用的问题

2017-01-12

git的三个区, 四个状态

  • 三个区 工作区 暂存区 版本库
  • 四个状态 未修改unmodified, 修改modified, 暂存staged, 未加入gituntracked

git撤销暂存区与工作区

  • 撤销工作区 git checkout <file>
  • 撤销暂存区 git reset <file>

git已经commit, 但是发现有些东西没改, 怎么撤销最近一次的commit,修改后重新commit

  • reset 慎用
    1. git reset --soft HEAD^1 --soft表示仅仅是HEAD指向上个版本, 但是 缓存区跟工作区不会有任何变化
    2. 再次修改
    3. git add 注意-A,.,-u参数的区别
    4. git commit -c ORIG_HEAD 此时可以修改上一次的commit信息
  • git commit --amend
    1. 做一些修改并提交到暂存区
    2. git commit --amend 此时可以修改上一次的提交信息, 最终只会产生一个提交

push的时候不希望产生很零碎的commit信息

假设现在在dev分支

  1. git checkout -b <temp> 首先切出一个新的分支, 在新的分支操作
  2. 做几次修改, 做几次提交
  3. git checkout dev 切回原来的分支
  4. git merge --squash temp --squash参数表示挤压的意思, 它会将temp这个分支的所有 commit 都放进dev的暂存区中, 此时dev分支就可以进行commit, 只会产生一次 commit 信息

很多时候代码被改的乱七八糟, 就需要回到之前的版本, 检查一下之前版本的代码, 然后再回来

  1. git checkout <之前的版本号> 这个命令会让HEAD脱离
  2. 这种情况下, 如果想提交修改, 可以创建出新的一个分支来实现:
  3. git checkout -b <branch name>
  4. 此时, 如果想回到之前未checkout版本号时的HEAD版本, 只需要检出之前所在的分支: git checkout <previous branch name>

冲突的解决

  • git merge 进入一个场景

    1. 基于远程分支origin, 创建一个新的分支, 叫做mywork git checkout -b mywork <remote>/origin

    2. 做一些修改, 产生两次commit

    3. 但是在此同时, 也有人在origin分支上做了修改并且push了, 这意味着originmywork分支各自前进了, 它们产生了分叉

    4. 这时候, 可以git pullorigin分支拉下来, 和自己的代码修改合并, 并解决冲突, 然后提交。这就产生了一次新的commit。上述过程就是3 commits 可以看到分支的修改记录, 并且额外产生了一次新的提交 当然, 如果origin分支没有修改的话, 那就是Fast Forward

  • git rebase 当然, 如果你希望mywork分支的记录看起来像没有经过任何合并一样

        git checkout mywork
        git rebase origin
    
    • 它会把mywork分支的commit都取消掉, 并且临时保存为patch, 放在.git/rebase目录中,然后把mywork分支更新到与origin同步, 最后把这些patch应用到mywork分支上.
    • 当然如果有冲突的话, 解决冲突后, git add ., git rebase --continue就可以继续了.
    • mywork分支更新后, 它就会指向新的commit, 而那些老的会被丢弃, git gc就可以删除这些丢弃的commit
    • pick, squash, edit这些参数的用法就不多阐述了
    • 你可以随时用git rebase --abort来终止rebase操作, 并且mywork分支会回到rebase开始前的状态

    rebase处理之后, 整个是一个链式的记录, 不会像merge那样出现分叉


pro git 中文 pro git en

锁窗前月明色, 雕阑外夜气清