我只记录一些我的常用命令,一些不常用的即使写了过一段时间也会忘掉的。实在要用直接help一下就行。


~/.gitconfig


[color]
        status = true
        branch = auto
        diff = auto
        ui = auto

[alias]
        st = status
        co = checkout
        ci = commit -a
        l = log --graph

[user]
        name = username
        email = youremail

常用命令

git log --all
git log只会显示HEAD及其祖先的log,要产看全部使用–all


git stash
非常有用的命令,把当前work目录做临时保存,并revert到HEAD。
使用git stash apply进行恢复。


回滚代码
git revert HEAD


你也可以revert更早的commit,例如:
git revert HEAD^


销毁自己的修改
git reset --hard


远程仓库相关命令

检出仓库:$ git clone git://github.com/jquery/jquery.git
查看远程仓库:$ git remote -v
添加远程仓库:$ git remote add [name] [url]
删除远程仓库:$ git remote rm [name]
修改远程仓库:$ git remote set-url –push [name] [newUrl]
拉取远程仓库:$ git pull [remoteName] [localBranchName]
推送远程仓库:$ git push [remoteName] [localBranchName]


如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
$ git push origin test:master // 提交本地test分支作为远程的master分支
$ git push origin test:test // 提交本地test分支作为远程的test分支


分支(branch)操作相关命令

查看本地分支:$ git branch
查看远程分支:$ git branch -r (如果还是看不到就先 git fetch origin 先)
创建本地分支:$ git branch [name] -—注意新分支创建后不会自动切换为当前分支
切换分支:$ git checkout [name]
创建新分支并立即切换到新分支:$ git checkout -b [name]
直接检出远程分支:$ git checkout -b [name] [remoteName] (如:git checkout -b myNewBranch origin/dragon)
删除分支:$ git branch -d [name] -— -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$ git merge [name] -—将名称为[name]的分支与当前分支合并
创建远程分支(本地分支push到远程):$ git push origin [name]
删除远程分支:$ git push origin :heads/[name] 或 $ git push origin :[name]


版本(tag)操作相关命令

查看版本:$ git tag
创建版本:$ git tag [name]
删除版本:$ git tag -d [name]
查看远程版本:$ git tag -r
创建远程版本(本地版本push到远程):$ git push origin [tagname]
删除远程版本:$ git push origin :refs/tags/[name]
合并远程仓库的tag到本地:$ git pull origin –tags
上传本地tag到远程仓库:$ git push origin –tags
创建带注释的tag:$ git tag -a [name] -m ‘yourMessage’


rebase

git-rebase命令主要用在从上游分支获取最新commit信息,并有机的将当前分支和上游分支进行合并。
假设master和develop是一个项目的两个分支,其中master是主分支,
develop是从master而来的开发分支,如果在develop分支上提交过2次,
之后又切换到master分支,做了一些修改并提交2次,
这时,如果想将master分支的最新修改内容合并到develop分支,但同时也不能影响master分支时,
就需要使用git rebase了,这时的上游分支为master。



执行git rebase master前:
              develop: 1 --> develop: 2
            /
master: 0 --> master: 1 --> master: 2

执行git rebase master后:
                                    develop: 1 --> develop: 2
                                   /
master: 0 --> master: 1 --> master: 2

blame

如果找到某个版本出现了问题,而之前的版本没问题,我们可以用git blame找出文件是何时被何人怎么修改的。
git blame [-L 行号1, 行号2] file


打包文件archive

git archive –format=zip -o arch.zip HEAD


bisect

如果我们发现有个问题在某些版本没问题,而在有些版本有问题时,我们可以借助git bisect来帮助我们定位问题。


git bisect start 
git bisect good commit-id1 
git bisect bad commit-id2 
这时,git会按照二分法找出good版本和bad版本中间的那个提交版本,并自动将工作状态切换到那个版本,
这时我们可以验证这个版本是不是有问题,如果有问题,通过
git bisect bad
告诉git,这时git会继续找出一个中间版本让我们来验证,直到我们找出,并告知git
git bisect good


这样一步一步我们就可以找出引入问题的版本,最后,我们可以使用
git bisect reset
结束查找,git会删除查找过程中在仓库中生成的临时文件,并将状态恢复到。


git fetch,pull区别?

git pull 就是git fetch 然后 git merge
git fetch 从另一个repository中下载objects and refs
You can do a “git fetch” at any time to update your local copy of a remote branch.
This operation never changes any of your own branches and is safe to do without changing your working copy.


git的requet-pull作用?


git cherry-pick

Apply the changes introduced by some existing commits
就是对已经存在的commit 进行apply (可以理解为再次提交)


git submodule

用于包含其他库,比如一个项目包含了一个开源的mp3解码库。