一、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保存的是当前工作空间的所有被修改未提交的文件)
stash save后,进行pull,然后apply,有可能产生冲突
在当前分支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
转载于:https://blog.51cto.com/a1liujin/1725379