Fork me on GitHub

Git 常用命令

 


--------------------------------------------------------------
gitbegin

git status 查看仓库当前的状态
git diff 查看具体修改的内容

丢弃本地新建文件
git clean -df

丢弃本地修改文件
本地修改文件,但是没有加到缓存区
git checkout -- file可以丢弃工作区的某一个修改的文件
git checkout . 丢弃工作区所有修改的文件

丢弃本地修改文件与新建文件
git checkout . && git clean -df

本地修改文件,且加到缓存区 git reset HEAD file 可以把暂存区的修改撤销掉(unstage),重新放回工作区,不写具体file就是把所有的修改文件都撤销掉
git reset HEAD

强制把远程仓库的代码覆盖掉本地
git reset --hard origin/master

修改文件后提交的步骤
git add .
git commit -m 'xxxxx'
git add .
git commit -m 'xxxxx'
git add .
git commit -m 'xxxxx'
git push

git commit -a -m 'xxxxx' 也可以一句话直接将所有文件提交到仓库,同上面两步, add和commit

git add -u 可以用于删除文件时候同步到远程库

git log 查看当前仓库的历史版本
git log --pretty=oneline 查看当前仓库的历史版本(将信息展示成一行)
git log --pretty=oneline --abbrev-commit 简写commit id的形式展示出来
git log --graph 命令可以看到分支合并图。

想将test分支中的C2 commit合并到master分支,丢弃C3的修改。
直接merge会把C3也合并进去,这时用git cherry-pick可以解决问题

先用git log查看,C2 commit的id,复制下来
git checkout 到master分支下
git cherry-pick <C2_id>

如果出现冲突,

先解决冲突
git add 将解决了冲突的文件添加到暂存区
git cherry-pick --continue就行

git reset –-soft <commit_id>:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可;
git reset -–hard <commit_id>:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉;

git reset --soft HEAD~3 最后三个commit


git reset --hard 3628164(这串是commit 时候的id) 回退都某一个历史版本,id不必写全,git会自动找,但是要唯一才行
git update-index --assume-unchanged 的真正用法是这样的:
你正在修改一个巨大的文件,你先对其 git update-index --assume-unchanged,这样 Git 暂时不会理睬你对文件做的修改;
当你的工作告一段落决定可以提交的时候,重置改标识:git update-index --no-assume-unchanged,于是 Git 只需要做一次更新,这是完全可以接受的了;
提交+推送。
git update-index --assume-unchanged /path/to/file #忽略跟踪
git update-index --no-assume-unchanged /path/to/file #恢复跟踪

在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法。这个文件每一行保存了一个匹配的规则例如:
# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件

doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
这样设置了以后 所有的 .pyc 文件都不会添加到版本库中去。
另外 git 提供了一个全局的 .gitignore,你可以在你的用户目录下创建 ~/.gitignoreglobal 文件,以同样的规则来划定哪些文件是不需要版本控制的。
需要执行 git config --global core.excludesfile ~/.gitignoreglobal来使得它生效。
其他的一些过滤条件
* ?:代表任意的一个字符
* *:代表任意数目的字符
* {!ab}:必须不是此类型
* {ab,bb,cx}:代表ab,bb,cx中任一类型即可
* [abc]:代表a,b,c中任一字符即可

* [ ^abc]:代表必须不是a,b,c中任一字符
由于git不会加入空目录,所以下面做法会导致tmp不会存在 tmp/* //忽略tmp文件夹所有文件
改下方法,在tmp下也加一个.gitignore,内容为
*
!.gitignore
还有一种情况,就是已经commit了,再加入gitignore是无效的,所以需要删除下缓存
git rm -r --cached ignore_file
当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用
git rm file_path

当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用
git rm --cached file_path

注意: .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
正确的做法是在每个clone下来的仓库中手动设置不要检查特定文件的更改情况。
git update-index --assume-unchanged PATH 在PATH处输入要忽略的文件。

另外 git 还提供了另一种 exclude 的方式来做同样的事情,不同的是 .gitignore 这个文件本身会提交到版本库中去。用来保存的是公共的需要排除的文件。而 .git/info/exclude 这里设置的则是你自己本地需要排除的文件。 他不会影响到其他人。也不会提交到版本库中去。

.gitignore 还有个有意思的小功能, 一个空的 .gitignore 文件 可以当作是一个 placeholder 。当你需要为项目创建一个空的 log 目录时, 这就变的很有用。 你可以创建一个 log 目录 在里面放置一个空的 .gitignore 文件。这样当你 clone 这个 repo 的时候 git 会自动的创建好一个空的 log 目录了。

如果即将开发一个新项目这时候远程没有仓库,这就需要在本地新建一个git仓库
1、git init命令把这个目录变成Git可以管理的仓库
2、git remote add origin http://192.168.0.170:4096/gittest.git 添加远程仓库地址
3、git push -u origin master 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

git stash 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash list 查看所有保存的工作场景
需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
git stash apply stash@{0}
git stash pop stash@{0}


git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m "blablabla..."可以指定标签信息
git show <tagname>查看标签信息
git tag -d v0.1 删除本地某一个tag标签
git push origin <tagname> 将某一个本地标签推送到远程
git push origin --tags 将本地所以tag标签推送到远程
git push origin :refs/tags/<tagname> 删除某一个远程tag标签


命令git tag可以查看所有标签。

如果开发已有git仓库的项目
第一步:git clone
git clone url filename(此项非必选,默认本地文件与远程地址相同)

第二步:git remote
为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
不带选项的时候,git remote命令列出所有远程主机。
git remote
使用-v选项,可以参看远程主机的网址。
git remote -v

输入 touch .gitignore ,生成“.gitignore”文件。

origin git@github.com:jquery/jquery.git(fetch)
origin git@github.com:jquery/jquery.git(push)
上面命令表示,当前只有一台远程主机,叫做origin,以及它的网址。
克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。
git clone -o jQuery https://github.com/jquery/jquery.git
上面命令表示,克隆的时候,指定远程主机叫做jQuery。
【git remote show <主机名> 】命令加上主机名,可以查看该主机的详细信息。
【git remote add <主机名> <网址>】命令用于添加远程主机。
【git remote rm <主机名>】命令用于删除远程主机。
【git remote rename <原主机名> <新主机名>】命令用于远程主机的改名。
git remote prune origin 将远程所有分支同步到本地
git remote set-url --add origin <url2> 往origin库里添加url2 以后再push的时候,就可以同时push多个库了

多处提交config
[remote "origin"]
url = git@git.oschina.net:jiaoshou/reacttest.git
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@git.coding.net:jsser/reacttest.git
[branch "master"]
remote = origin
merge = refs/heads/master


第三步:git fetch
git fetch <远程主机名>
上面命令将某个远程主机的更新,全部取回本地。
git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。
默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。
git fetch <远程主机名> <分支名>
比如,取回origin主机的master分支。
git fetch origin master
所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。
git branch 查看当前所在分支
git branch命令的-r选项,可以用来查看远程所有分支,-a选项查看本地和远程的所有分支。
git branch -r
git branch -a
上面命令表示,本地主机的当前分支是master,远程分支是origin/master。
取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。
git checkout -b dev origin/master
上面命令表示,在origin/master的基础上,创建一个dev新分支,并切换分到新建dev分支。
切换分支 git checkout xxx
删除本地分支 git branch -d xxxxx
进行merge操作执行,需要先将本地修改进行commit操作
git merge dev 将本地dev分支合并到当前分支
git merge --squash dev 将本地dev分支合并到当前分支(不显示dev分支上的历史版本),产生一次新的commit
git merge origin/dev 将远程dev分支合并到当前分支
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。
git merge origin/master 或者
git rebase origin/master
上面命令表示在当前分支上,合并origin/master。
/*
使用下面的关系区别这两个操作:
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
现在来看看git merge和git rebase的区别。
假如你从origin版本C 创建个E分支,commit了3次修改,当你需要push的时候,另外一个人origin的C已经更新成D,这时候E不应该提交,应该提交后会产生冲突,这时候有两种方法可以解决:
1、git merge
用git pull命令把"origin"分支上的修改pull下来与本地提交合并(merge)成版本M,但这样会形成图中的菱形,让人很困惑。
2、git rebase
创建一个新的提交R,R的文件内容和上面M的一样,但我们将E提交废除,当它不存在(图中用虚线表示)。由于这种删除,小李不应该push其他的repository.rebase的好处是避免了菱形的产生,保持提交曲线为直线,让大家易于理解。
在rebase的过程中,有时也会有conflict(冲突),这时Git会停止rebase并让用户去解决冲突,解决完冲突后,用git add命令去更新这些内容,然后不用执行git-commit,直接执行git rebase --continue,这样git会继续apply余下的补丁。git rebase --skip,这个可以跳过当前冲突,进行下一个补丁。
在任何时候,都可以用git rebase --abort参数来终止rebase的行动,并且mywork分支会回到rebase开始前的状态。
*/


第四步:git pull
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin next
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。
git fetch origin
git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。
Git也允许手动建立追踪关系。
git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
git pull
上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
如果合并需要采用rebase模式,可以使用--rebase选项。
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
如果远程主机删除了某个分支,默认情况下,git pull不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数-p就会在本地删除远程已经删除的分支。
git pull -p 等同于下面的命令
git fetch --prune origin
git fetch -p

第五步:git push
git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。
git push <远程主机名> <本地分支名>:<远程分支名>
注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push origin :master 等同于git push origin --delete master
上面命令表示删除origin主机的master分支。
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
git push
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
git push -u origin master
上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

 

posted @ 2015-03-21 20:51  较瘦  阅读(3198)  评论(0编辑  收藏  举报
知识点文章整理