个人常用-GIT命令

高频使用

  • 查看分支 git branch -a
  • 创建分支 git branch name
  • 切换分支 git checkout name
  • 创建并切换 git checkout -b name
  • 合并某分支到当前分支 git merge name
  • 删除分支 git branch -d name

推荐阅读
http://www.oschina.net/question/31384_157479
http://www.liaoxuefeng.com/wiki/

客户端推荐: 可以使用 TortoiseGit 或者 SourceTree

(1) 创建本地仓库
git init --bare shared.git (或者 git init)

(2)配置个人信息

git config user.name "wangli"
git config user.email "user@qq.com"
或者 
git config --global user.name "wangli"
git config --global user.email "user@qq.com"

(3)cat index.jsp

(4)echo "this is test file" > index.jsp

(5)复制仓库到本地

git clone /f/software/repository/git/shared.git/ . (注意有个点,表明当前目录)
git clone git@github.com:wangli0/appdemo.git .或者
(git clone git@github.com:wangli0/appdemo.git)

(6)mkdir learngit

(7)pwd //显示当前路径

(8)git status
命令可以让我们时刻掌握仓库当前的状态

(9)未提交
$ git diff readme.txt (diff --> difference)
【使用时机,修改readme.txt,但还没有准备提交(还未add commit),想看看此次修改和上次提交的区别】
提交后
git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别

(10)git status掌握工作区的状态

(11)git log (显示从最近到最远的提交日志) 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline (git log --pretty=oneline)

(12)版本回退

 或者 指定回退的commit对象的id
($ git reset --hard 3628164) 版本号没必要写全,git会自动找
Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^,再往上就是 HEAD~100

(13)用git log穿梭前,可以查看提交历史,以便确定要回退到哪个版本, 要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本
(14)git checkout

git checkout -- readme.txt把readme.txt
文件在工作区的修改全部撤销
--很重要,没有的话就变成了“切换到另一个分支”的命令

*两种情况*

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;(还不如再次git pull一次或者 直接vim readme.txt)【改变的是工作区内容】

一种是readme.txt已经添加到暂存区后,***又在工作区作了修改xx ***,现在,撤销修改就回到 刚刚git add到暂存区时的状态[暂存区还在](且 工作区内容撤销xx)

(15)git reset HEAD readme.txt
把暂存区的修改撤销掉(unstage)[暂存区不复存在],重新放回工作区

(16)删除文件(注,git中删除也是修改操作)

rm index.jsp 
git rm index.jsp
git status
git commit -m "remove index.jsp"

(17)github 的使用
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的
需创建 SSH key

$ ssh-keygen -t rsa -C "youremail@example.com"

(18)touch readme.md 创建一个空文件

(19)无论是

(1)从远程克隆
(2)或者是本地项目提交到github 都需要先在github上面创建一个仓库。方式二 用的多,此种方式连README.md都不能创建【空仓库】,一旦创建,本地和远程版本就不一致了,需要先pull才可以
方法1 省略
方法2

echo # Appdemo >> README.md
git initgit add README.md
git commit -m "first commit"
git remote add origin git@github.com:wangli0/Appdemo.gitgit
push -u origin master

注意: 用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来

移除关联
git remote rm origin(如果关联已经添加,再次添加会报错)

(20)git checkout -b dev创建dev分支,-b参数表示 创建并切换

git checkout -b dev 
<===>
git branch dev (创建分支 dev)
git checkout dev (切换到dev分支)
git branch 列出当前的分支

(21)合并分支 && 删除分支

如 当前的分支是 master

git merge dev // 把dev分支合并到当前分支(默认是Fast-forward快进模式 也就是直接把master
指向dev的当前提交,所以合并速度非常快。)
git branch -d dev  //现在可以删除 dev分支了

(22)合并分支造成的冲突 (例子)

步骤1
master 分支

git add a.jsp 
git commit a.jsp -m "the content is a" 

dev 分支

git add a.jsp 
git commit a.jsp -m "the content is aaaa"

步骤2
合并分支

$ git merge dev  // 冲突产生,两分支同时修改了一行 , git status查看 冲突的文件

步骤3
修改冲突:

vim a.jsp
git add a.jsp
git commit  -m "conflict fixed" (commit不加文件名哦)

(23)git log --graph --pretty=oneline --abbrev-commit 查看 分支的合并情况 删除分支 git branch -d dev

(24)git log --graph
命令可以看到分支合并图

(25)合并分支 续

git merge dev(快进模式) 
git merge --no-ff -m "merge with no-ff" dev 

(26)查看分支历史 git log
git log --graph --pretty=oneline --abbrev-commit

(27)合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而 fast forward
合并就看不出来曾经做过合并。

(28)bug分支

> 1.正在 dev分支上工作,此时需修复bug 
git stash  (保存当前的工作区如 修改index.jsp文件或 git add index.jsp文件 但是还没有提交 commit)
> 2. 切换到修复bug的分支 如 master 
git checkout master
> 3. 创建bug分支
git checkout -b issue-101   (在此上面修复bug)
> 4. 修复完成后,切换到master分支,合并分支issue-101,并删除issue-101分支
git checkout master    
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101
> 5. 是时候接着回到dev分支干活了
 git checkout dev (git status 发现 working directory clean工作区是空的 )
> 6.  git stash list 查看工作现场存哪里了
> 7. 恢复工作区 
***方式1***
git stash apply (恢复后,stash内容并不删除)
***方式2***
git stash pop (恢复的同时把stash内容也删了)
> 8. 你可以多次stash,恢复的时候,先用git stash list
查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
-------------------------

(29)标签

git tag v1.0  (标签就是快照,在当前最新commit上打了一个快照)
或者针对 某个commit id 打标签 
git tag v1.0 622222 (622222是commit id)

(30)查看标签列表
git tag

(31)查看标签信息
git show v1.0 (git show <tagname>)

(32)创建 带有说明的标签
git tag -a v1.0 -m "version1.0的标签" 6222222

(33)操作标签

git tag -d v1.0  删除标签 (因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。)
git push origin v1.0  (git push origin <tagname> 
)推送某个标签 到远程仓库
git push origin --tags  //推送本地所有为推送的 标签到远程

删除已经推送到远程的标签

git tag -d v1.0 
git push origin :refs/tags/v1.0    //注意格式

(34)git config --global color.ui true //Git显示颜色,会让命令输出看起来更醒目

(35)feature分支(和bug分支,普通分支完全一样,主要用于开发新功能)

> 1.git checkout -b feature-1 新建分支,并编写完成新功能
> 2. git checkout dev (切换开发分支)
> 3. git branch -d feature-1
一切顺利的话,feature分支和bug分支是类似的,合并,然后删除
> 4. 但是不顺利事情是常有的(突然因经费问题被叫停 )
分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D feature-1(**合并后** 的分支删除方法是git branch -d feature-1 小写)
丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除

(36)推送分支

远程仓库的默认名称是origin
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上

git push origin master  // 指定本地分支 master->远程master
git push origin dev  //指定本地分支 dev ->远程 dev 

远程库clone时候 //默认只能clone到远程分支的master分支

 我需要在dev分支上开发,就必须创建远程origin的dev分支到本地
 `git checkout -b dev origin/dev`

(37)两人同时push 产生冲突
同样的一个文件 index.jsp ,两人都做了修改

人1: 先git push index.jsp -m 'update a file"
人2: git push index.jsp -->出现冲突

原因: 因为你的小伙伴的最新提交和你试图推送的提交有冲突
解决方案:

人2 : git pull
把最新的提交从origin/dev抓下来,然后,在*本地合并*,解决冲突,再推送
注意: pull的时候 需要指定 本地 dev分支与 远程 origin/dev分支的链接  `git branch --set-upstream dev origin/dev`

(38)git remote -v 查看 远程库信息


注意事项

* 从本地推送分支,使用git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交

* 本地新建的分支如果不推送到远程,对其他人就是不可见的
* git pull命令,不能在同一个用户下面git pull得到自己刚刚提交的,会提示当前文件已经是最新的,pull 不下来 
* 直接在远程客户端 web上面更新a 文件,在电脑上面就可以git pull得到刚刚更新的代码
* 不同的用户目录(本地仓库如user1,user2)默认都有一个master分支
* git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
* github 上面 的 pull request用于你fork了别人的项目,然后修改fork后的代码,想提交到 别人的项目里面,就需要点击 pull request
* 研究发现,如APPdemo文件夹下,git init 初始化本地仓库
git add ,git commit,都是在当前文件夹下面进行的
只有git push推送到远程仓库(或者本机其他目录下的仓库中[也算远程仓库,只不过是离线的远程仓库]) 
***前提是需要关联本地仓库 与远程仓库***
*** git clone 命令时候 默认会做一次关联***
***没有管理的话,需要我们自己手动关联***

* 但是不管远程仓库(net) 远程仓库(本机),本地仓库(某一个文件夹)本质上都是仓库

* 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成


master分支是主分支,因此要时刻与远程同步;

dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

标签是为了打上版本号信息,当然不能乱叫,通常用:
v1.0, v1.1, v2.0 ...
或者按发布日期:
build-20150702, build-20150910 ...


如果你想修复bootstrap的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。

如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。当然,对方是否接受你的pull request就不一定了。

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status
都会显示Untracked files ...
,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore
文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:[https://github.com/github/gitignore](https://github.com/github/gitignore)

如忽略 
Python编译产生的.pyc
、.pyo
、dist
等文件或目录:

//  # 是注释   *通配符 
# Python:
*.py[cod]
*.so
*.egg

git 工作区 和暂存区 各个分支用的是同一个,仅仅提交的时候由于指针指的地方不同,令我们感觉似乎在不同区间上面工作,且git限定我们 工作区间被修改(如 index.jsp 被修改或被git add但是未 commit) 此时 git是不允许git checkout (切换分支的)

注意关联远程仓库 和 关联 远程分支

**关联远程仓库**
git remote add origin git@github.com:wangli0/Appdemo.gitgit
**关联远程分支**
git branch --set-upstream dev origin/dev

某教程里面的简单命令

==============版本管理员操作========================
第一步: 创建数据仓库

git init --bare shared.git

==============开发人员1操作=============================

第二步:复制仓库到本地

git clone /f/software/repository/git/shared.git/ . (注意有个点,表明当前目录)

第三步:设置个人信息

git config user.name "user1"
git config user.email "user1@163.com"


第四步:忽略无需版本控制的文档

echo "*.txt" > .gitignore

第五步:新建一个文件

echo "User1 add content" > index.jsp

第六步:提交文件

git add index.jsp
git commit -m "User1 add the file"


第七步:把自己的仓库提交到公共服务器

git push origin master

==============开发人员2操作=============================

第八步:复制仓库到本地

git clone /f/software/repository/git/shared.git/ .

第九步:设置个人信息

git config user.name "user2"
git config user.email "user2@163.com"

第十步:忽略无需版本控制的文档

echo "*.txt" > .gitignore

第十一步:新建一个文件

echo "User2 add content" >> index.jsp

第十二步:提交文件

git add index.jsp
git commit -m "User2 add the file!"


第十三步:把自己的仓库提交到公共服务器

git push origin master


==============开发人员1操作=============================
第十四步:下载服务器最新数据

git pull


网络上面别人对git的一些理解(此段转载)

大白话讲解如何给github上项目贡献代码

(1) 最最开始,我以为git clone [项目地址],也就是把代码clone下来 然后修改,然后push到项目里就可以了。后来发现,这种情况只适合该项目属于你自己的情况,如果你git clone别人的项目代码,你想push都push不上去,因为 git push 不是需要你输入github帐号密码么。

(2)然后 我就知道了 github上 不是有个fork么, 好,那么给别人的项目提交代码的方式就有了,先fork下别人的代码,于是你的github上就出现了同名的项目,这个项目就属于你自己了,你把这个自己的项目git clone到本地,修修改改,然后push到你自己的项目里,那么你如何把你对自己项目的改动,给发到之前fork的那个原项目呢,看见了没,在github上你的项目页面有个按钮,叫Pull request,对 你点它就会把你的修改发到对方的项目里,人还会收到邮件呢,由原项目主人决定是否接受你的修改。但是,这样问题就出来了,在你fork他的项目之后,如果他又更新了代码,你自己fork的项目怎么做到和原项目同步呢? 我就想啊,是不是 我还得重新git clone原项目的代码,然后手动合并到我fork的项目里呢。。。梁老师说,你丫这太蛋疼了,肯定不是这么麻烦,我细想,也是啊,这不2么。。。

(3)然后,从《Pro git》上看到一个知识点,我擦,github居然可以给项目添加合作者,也就是说,假如你,对,说你呢,戴眼镜那个,你想参与我的项目,你跟我说一声,我就把你添加到我的项目里作为合作者,这个选项在项目的设置里面有,只要我添加你了,你就可以git clone我的代码然后修修改改,然后直接push上来就行了,就不用fork那么麻烦了,如果你要更新服务器代码,只要git pull就行了,看 合作者这东西多方便,就像我们在公司用svn似的。

(4)然后我就想啊,有了合作者还需要你丫fork这个功能干啥?仔细一想,你写个好项目,不能随便加合作者啊,加了个熊孩子把你代码改废了可咋整,这年头熊孩子很多,我自己不就是一个么。所以fork肯定还是需要,fork就是专门预防熊孩子的,这就是真相!那么前面说道到fork之后如何与原项目同步的问题还在啊,没有得到解决。

(5)于是《Pro git》再次给了我一个解答,具体流程是你啊想给我的项目做贡献,你先git clone我的代码到本地,然后修修改改,然后你不是不能push到我的项目里么,你可以先在github页面上fork我的项目,有了你自己的项目地址(url)之后呢,你在本地操作git remote add [sort name] [your url],意思就是添加第二个远程仓库地址,这个仓库的“昵称”就是你刚指定的[sort name],然后,你之后push文件呢 就通过指定这个[sort name]来push到这个你自己的仓库里。等你觉得想要把你改的发给原项目同步,就在你的项目上点Pull request按钮.说下另一种情况,如果是,原项目发生了改动,你要想同步到本地,就直接从git fetch origin 从原项目的地址同步代码,然后再merge就好了。当然,如《Pro git》上所写,你可以通过新建分支的方式往自己的项目上push,这样同步的时候直接fetch就行了。

使用git在本地创建一个项目的过程

$ makdir ~/hello-world    //创建一个项目hello-world  
$ cd ~/hello-world       //打开这个项目    
$ git init             //初始化     
$ touch README   
$ git add README        //更新README文件    
$ git commit -m 'first commit'     //提交更新,并注释信息“first commit”    
$ git remote add origin [git@github.com:defnngj/hello-world.git](mailto:git@github.com:defnngj/hello-world.git)     //连接远程github项目      
$ git push -u origin master     //将本地项目更新到github项目上去

git 常见错误

fatal: remote origin already exists.
如果输入$ git remote add origin [git@github.com:djqiang(github帐号名)/gitdemo(项目名).git](mailto:git@github.com:djqiang/gitdemo.git) 
    提示出错信息:fatal: remote origin already exists.
    解决办法如下:
    1、先输入$ git remote rm origin
    2、再输入$ git remote add origin [git@github.com:djqiang/gitdemo.git](mailto:git@github.com:djqiang/gitdemo.git) 就不会报错

一张图告诉你 git的最 常用命令

Paste_Image.png

技巧篇

漂亮的 log界面

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

最近一次的提交
git config --global alias.last 'log -1' //等价 git log -1

配置文件

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中
cat .git/config  

难点篇

git stash命令 stash(隐藏,藏匿)

使用场景:

当你接到一个修复一个bug的任务时,创建一个分支issue-101
来修复它,但是当前正在dev
上进行的工作只进行到一半,还没法提交,但是此时 必须在两个小时内修复该bug,怎么办?

Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作

使用说明:

使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用'git stash apply'将以前一半的工作 应用回来

也许有的人会说,那我可不可以多次将未提交的代码压入到栈中?
答案是可以的。当你多次使用'git stash'命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,'git stash list'命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用'git stash apply stash@{1}'就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用'git stash clear'来将栈清空。在这里顺便提下git format-patch -n , n是具体某个数字, 例如 'git format-patch -1' 这时便会根据log生成一个对应的补丁,如果 'git format-patch -2' 那么便会生成2个补丁,当然前提是你的log上有至少有两个记录

看过上面的信息,就可以知道使用场合了:当前工作区内容已被修改,但是并未完成。这时Boss来了,说前面的分支上面有一个Bug,需要立即修复。可是我又不想提交目前的修改,因为修改没有完成。但是,不提交的话,又没有办法checkout到前面的分支。此时用Git Stash就相当于备份工作区 了。然后在Checkout过去修改,就能够达到保存当前工作区,并及时恢复的作用。

多人协作小结

  • 查看远程库信息,使用git remote -v;
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容