git 常用命令小记
21 August 2016

关联本地分支和远程分支

git clone命令会自动在本地建立一个master分支,它是origin/master的‘追踪分支’。使用git pull / git push就可以将本地master分支和远程origin/master通信。但是如果你本地新建立了个develop分支,想提交时却要git push origin develop才能送到远程develop分支上,push也是要指明orgin develop。git 不会自动关联,这会很不方便。所以需要通过命令一次性建立本地分支和远程分支的关联

  • set-upstream

      git branch --set-upstream my_branch origin/my_branch
    

    –set-upstream 将被废弃并删除. 使用 –track 或者 –set-upstream-to来替代。

  • track

      git branch --track experimental origin/experimental
    
  • set-upstream-to

    在develop分支上

      git branch --set-upstream-to=origin/develop
    

    或简写:

      git branch -u origin/dev
    

    也可以在第一次将本地分支提交到远程时可以直接建立联系

      git push -u origin my_branch
    

忽略掉已经被误添加到git库中的文件

首先要讲忽略文件补到.gitignore中,然后重置git库信息:

git rm -r --cached .
 	git add .
 	git reset HEAD

如果你已经将不该被版本控制的文件添加到远程了,要手动删除远程的这些文件。

顺便提下:忽略所在库根目录下的文件 package.json会忽略库下所有package.json文件,包括子目录下的文件,如package/package/package.json /package.json才只会忽略库根目录下的package.json文件

git rebase

merge是将2个commit对象合并生成新的commit对象。rebase在base commit后创建新commit对象,将待合并的commit移到这里。结果就二十rebase的提交历史永远是线形的。

水太深,好好读官方文档:

Git Branching - Rebasing

git pull —rebasegit rebase -i commitID后若存在冲突:

git add <some-file>
git rebase --continue

修改密码

image

根据版本新建分支

git branch branchName HEAD~3
git branch branchName commitId

撤销修改与回退

  • 撤销工作目录(未add,未commit)修改

      git checkout -- fileName
    
  • 撤销缓存区修改(已经add,未commit)的最新修改

    只是移除暂存区的内容,而不是撤销对工作目录的修改。

      git reset HEAD -- fileName
    
  • 撤销版本库(已经commit)修改【回退版本】

      git reset --hard HEAD~3
      git reset --hard versionId
    

git reset 参数:

  • –soft : 缓存区和工作目录都不会被改变
  • –mixed : 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
  • –hard : 缓存区和工作目录都同步到你指定的提交

修改commit 信息

  • 最新的commit

    • 会生成新的commit id,需要其他合作者也更新

        git commit --amend -m "New commit message"
      
    • commit合并到上一次&本次提交不会有commit 信息

        git commit --amend
      
  • 还未提交到远程的本地的commit信息(可能多条)

    git rebase -i versionId 后在终端vim里改,将你需要修改的commit 选择r模式

    image

  • 将分支上所有commit 作为一条commit信息合并

      git checkout master
      git merge --squash branchName
      git commit
    

暂存

git stash

用于将当前修改存暂存区但不提交,新建一个分支进行下一步可能提交的修改

  • 查看stash文件:

      git stash list
    
  • 恢复暂存区文件到工作目录

      git stash apply
    
  • 将文件从暂存区移除:

      git stash apply //恢复
      git stash drop //删除
    

    或者

      git stash pop //恢复的同时把stash内容也删了
    

将cherry-pick合并某个提交到自己的分支中

如果只想将远程仓库的一个特定提交合并到自己的分支中该怎么做呢?可以使用git cherry-pick 来选择给定SHA值的提交,然后将其合并到当前分支中:

	git cherry-pick versionId

也将本地分支的某个commit 版本合并到主支

git checkout new-feature
git log   找到版本号
git checkout master
git cherry-pick versionId

标签相关

  • 推送指定标签:

      git push origin v1.5
    
  • 推送多个标签:

      git push origin --tags
    
  • 查看git标签列表

      git tag -l
    
  • 查看某个标签下的代码

      git checkout tag_name
    
  • 在 tag 代码的基础上做修改

    checkout切换到某个标签上,git 会提示你当前处于一个“detached HEAD” 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要一个分支 git checkout -b branch_name tag_name

查看文件每一行最近修改信息

能查看到文件的每个部分是谁修改

git blame 文件名

git bisect开启debug

git bisect:debug,通过测试找出出问题的版本(二分查找)

  1. 开始bisect

     git bisect start
    
  2. 告诉git当前版本是有bug的

     git bisect bad
    
  3. 告诉git 你所知道的正常的版本

     git bisect good versionId
    

    (如果你不清楚具体的版本号,小项目就设最开始的版本吧,返回初始版本: git rev-list --max-parents=0 HEAD

  4. 运行测试。你要提前写好测试代码或者能找到测试特征

     make test
    
  5. 告诉git测试结果,并重复4

     git bisect bad|good