一、git基本命令

1)git init                 #在本地建一个git管理目录

2)git clone git://...git   #将仓库中的全部分支分支克隆到本地当前git管理目录

3)git status               #查看当前目录中,文件的修改状态

4)git add 文件名           #添加到git管理

5)git diff               #查看当前目录所有修改过的文件(修改过还没有使用commit提交的文件)

6)git diff --cached      #可以查看使用add阶段化后的差别

7) git diff branch_name   #比较当前分支与branch_name分支的不同

7)git diff 节点号1   节点号2      #比较2个节点的不同

7)git rm 文件名  & git rm -r 文件夹        #删除文件和文件夹

8)git commit --m "new version"    #提交到本地库

9)git push origin master          #将本地库同步到远程核心库

10) git checkout  branchname   #切换到某个分支或检出一个远程分支

11) git revert HEAD          #还原最近一次提交的修改 (HEAD始终指向当前分支的当前节点)

12) git revert commit-id     #还原到指定节点的修改:

13) git log -p branch_name   #显示当前分支的提交记录,及代码变更。

13)  git log                  #显示当前分支的提交记录

origin的含义:在clone完成之后,Git 会自动为你将此远程仓库命名为origin(origin相当于一个远程仓库的别名,运行git remote –v或者查看.git/config可以看到origin的含义

二、git分支管理(分支管理开发过程:http://blog.jobbole.com/25877/)

1.git branch -a 查看所有分支,包括远程的origin/master和本地的master(origin/master是存储在本地的远程主分支)

2.git fetch 将远程的代码同步到origin/master,但是没有合并到master分支;这一步一般不会有冲突

3.git merge 合并origin/master与master分支,可能产生冲突;也可以用rebase,这样可以减少分支的出现

4.git log --oneline --graph --stat  origin/master -p  查看分支的log,-p显示修改部分

5.git difftool  比较更改

6.git checkout 检出当前分支中的代码到工作目录,覆盖工作目录中的指定文件

(1)git checkout filename  从暂存区(cash)中检出文件,覆盖工作目录中的指定文件

(2)git checkout HEAD filename 从仓库中检出文件,覆盖暂存区和工作目录.

7.reset和checkout的比较:

(1)checkout不能做commithash之间的复位

(2)一次checkout一定会改变工作目录的内容,使得工作目录中的内容与暂存区或与仓库中的俄内容一致.

(3)一次reset一定会试图改变HEAD的位置,reset之后,HEAD都会指向指定节点commithash,如果该commithash不是HEAD,那么该commithash之后的节点将会从仓库中被删除.checkout是不会影响HEAD位置的.

(4)reset可以将仓库中的commithash还原到指定commithash;可以将暂存区还原到仓库中的指定commithash;可以将工作目录还原到仓库中的指定commithash

git reset --hard HEAD = git checkout HEAD     检出到本地工作目录和暂存区

git reset HEAD  检出到暂存区,默认为--soft(如果暂存区有add的提交,将会被回退到unstaged状态,工作目录不变,这种情况任何已有的修改都不会丢失)

git reset --hard HEAD  =  git reset HEAD  +  git checkout


(4)重点:checkout针对于每个文件的还原;reset针对于所有文件(整体状态)的还原

8.git diff

(1)git diff file 比较工作目录与暂存区的不同

(2)git diff --cached file 比较暂存区与仓库的不同

(3)git diff commithash file 比较工作目录与仓库的不同,如果时当前HEAD,那么commithash=HEAD

(4)git diff commithash1 commithash2 file 计较任意2个commithash的不同

(5)git diff branchname  filename  比较当前分支与指定分支的不同

9.git log

(1)git log brname  查看任意分支的log (有意选项:--graph  --oneline)

(2)git log origin/master  查看origin/master远程分支的log有重要的意义,可以知道远程分支的开发;使用fetch也是同步到该分支,不会产生冲突

(3)git log --stat HEAD 查看HEAD commithash修改过的文件有哪些

(4)git show查看文件的具体修改内容

10.分支管理

1)git branch-a 列出本地所有分支(包括隐含分支)

2)git branch -r         #列出远程所有分支

3)git branch -a         #列出本地分支和远程分支

4)git clone -b branchname https://github.com/jetty/     #克隆指定的远程分支


5)git branch newbranchname              #新建一个本地分支

6)git checkout branchname               #切换到分支branchname,并将该分支检出到工作目录和暂存区

7)git checkout -b newbranchname            #创建并切换到新分支

8)git branch -m|-M oldbranch newbranch      #重命名分支,如果newbranch名字分支已经存在,则需要使用-M强制重命名,否则,使用-m进行重命名。

9)git branch -d|-D branchname #删除[-D强制删除]branchname分支

10)git branch -d -r branchname #删除远程branchname分支

11)git branch newbranch commithash #以commithash为起点,创建新分支newbranch

12)git remote  -v #查看origin对应的远程仓库地址

13) git remote add origin http://10.9.111.221/liujin/multiproject.git  #修改origin对应的远程分支

13)git log --oneline --decorate --graph --all  #查看提交历史、各分支指向以及分支的分叉情况

14)git push origin : branchname#推入origin指向的远程地址的branchname分支

15)git checkout maste -> git merge branchname#将branchname分支合入主分支,修改冲突的文件后,git add 文件 然后git commit

16)git tag -a  1.2  #打一个标签

11.合并与提交

fetch与pull

在将本地的代码库合并到远程代码库之前,需要做一次fetch或pull,并解决相关的冲突

1). 合并步骤

a. git fetch:相当于是从远程获取最新版本到本地origin/master,不会自动merge,于是不会产生冲突

   git fetch origin master         //首先从远程的origin的master主分支下载最新的版本到origin/master分支上,origin/master分支是一个隐形分支

   git log -p master..origin/master  //然后查看远程的log,-p显示每次提交的代码的修改部分

b. git merge origin/master          //最后进行合并


上述过程其实可以用以下更清晰的方式来进行:

git fetch origin master:tmp    //从远程获取最新的版本到本地的tmp新分支上(:指取一个别名)

git diff tmp                   //比较当前分支与tmp分支的不同

git merge tmp               //之后再进行比较合并,并解决冲突

git branch -d tmp            //删除临时分支


2). git pull:相当于是从远程获取最新版本并merge到本地(相当于svn的update)

git pull origin master   //更新远程版本库到本地版本库

git pull origin branchname      //拉取fork库中的一个分支

上述命令其实相当于git fetch 和 git merge

在实际使用中,git fetch更安全一些

因为在merge前,我们可以查看更新情况,然后再决定是否合并

3).merge

git merge tmp   //将当前分支与tmp分支合并,如果存在冲突,那么修改冲突所在的文件,然后使用以下命令提交修改的文件

git commit -a -m 'Resolved conflict'  //提交(也可以用add和commit 2条命令替代)

git push origin master

最后就可以push到远程版本库了


在有冲突的文件中

<<<<<<<标记冲突开始,后面跟的是当前分支中的内容。

  HEAD指向当前分支末梢的提交。

=======之后,>>>>>>>之前是要merge过来的另一条分支上的代码。

>>>>>>>之后的符号是该远程分支的名字。


三.提交远程版本库与合并

fetch与pull
在将本地的代码库合并到远程代码库之前,需要做一次fetch或pull,并解决相关的冲突
1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge
git fetch origin master         //首先从远程的origin的master主分支下载最新的版本到origin/master分支上,origin/master分支是一个隐形分支

git log -p master..origin/master  //然后查看远程的log,-p显示每次提交的代码的修改部分
git merge origin/master          //最后进行合并

上述过程其实可以用以下更清晰的方式来进行:
git fetch origin master:tmp    //从远程获取最新的版本到本地的tmp新分支上(:指取一个别名)
git diff tmp                   //比较当前分支与tmp分支的不同
git merge tmp               //之后再进行比较合并,并解决冲突
git branch -d tmp            //删除临时分支

2. git pull:相当于是从远程获取最新版本并merge到本地(相当于svn的update)
git pull origin master   //更新远程版本库到本地版本库
git pull fork源 分支      //拉取fork库中的一个分支
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并
3.merge
git merge tmp   //将当前分支与tmp分支合并,如果存在冲突,那么修改冲突所在的文件,然后使用以下命令提交修改的文件
git commit -a -m 'Resolved conflict'  //提交(也可以用add和commit 2条命令替代)
git push origin master
最后就可以push到远程版本库了

在有冲突的文件中
<<<<<<<标记冲突开始,后面跟的是当前分支中的内容。
  HEAD指向当前分支末梢的提交。
=======之后,>>>>>>>之前是要merge过来的另一条分支上的代码。
>>>>>>>之后的符号是该远程分支的名字。

四、stash

git stash list [<options>]
git stash show [<stash>]
git stash drop [-q|--quiet] [<stash>]
git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
         [-u|--include-untracked] [-a|--all] [<message>]
git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
         [-u|--include-untracked] [-a|--all] [-m|--message <message>]]
         [--] [<pathspec>…]]
git stash clear
git stash create [<message>]
git stash store [-m|--message <message>] [-q|--quiet] <commit>

描述

当要记录工作目录和索引的当前状态,但想要返回到干净的工作目录时,则使用git stash。 该命令保存本地修改,并恢复工作目录以匹配HEAD提交。

这个命令所储藏的修改可以使用git stash list列出,使用git stash show进行检查,并使用git stash apply恢复(可能在不同的提交之上)。调用没有任何参数的git stash相当于git stash save。 默认情况下,储藏列表为“分支名称上的WIP”,但您可以在创建一个消息时在命令行上给出更具描述性的消息。

创建的最新储藏存储在refs/stash中; 这个引用的反垃圾邮件中会发现较旧的垃圾邮件,并且可以使用通常的reflog语法命名(例如,stash@{0}是最近创建的垃圾邮件,stash@{1}stash@{2.hours.ago}之前也是可能的)。也可以通过指定存储空间索引(例如整数n相当于储藏stash@{n})来引用锁存。

stash apply或者pop时可能会产生冲突,需要解决冲突。产生冲突的场景:(stash保存的是当前工作空间的所有被修改未提交的文件)

  1. stash save后,进行pull,然后apply,有可能产生冲突

  2. 在当前分支apply其它 分支save的内容,git将合并两个文件,可能产生冲突


五、revert反转

作用:撤销指定的某“一次”提交,可能产生冲突。revert不会删除原commit,只会产生一个新的commit。

# 撤销前一次 commit

git revert HEAD                

# 撤销前前一次 commit

git revert HEAD^

# 撤回指定commit-id#比如:git revert 0818badf6882ea2664a205bc8ef3a85425bb2537

git revert commit-id


git revert 329515

这个时候git提示你有冲突要解决。我们打开A.txt,修改冲突,并执行以下命令

git revert --continue

这个时候git会继续撤回,如果发现冲突会继续提示。

如果不想解决冲突的话可以取消撤回:

git revert --abort