一、本地资源第一次推送到远程仓库
![](https://i-blog.csdnimg.cn/blog_migrate/3d0f6eee7f7c874354fef9679647b5c3.png)
进入到一个目录
demo
$ git init
初始化版本库
$ git add .
添加
demo
下的文件到暂存区
$ git commit -m
‘
first commit
’
提交代码到版本库
$ git remove add origin
远程仓库地址
将本地仓库与远程仓库相关联
$ git push -u origin
分支名
$ git push -u origin master //
第一次推送
$ git push origin master //
第一次推送后,直接使用该命令即可推送修改
$ git remote
查看所有远程主机
$ git remote -v
查看所有远程主机的网址
$ git remote show <
主机名
>
拆线该主机的详细信息
$ git remote add <
主机名
><
网址
>
添加远程主机
$ git remote rm <
主机名
>
删除远程主机
$ git remote rename <
原主机名
> <
新主机名
>
修改远程主机的名字
git gui
二、第一次从远程仓库clone代码到本地
$ git clone
远程仓库地
$ git clone xxx.git "
指定目录
" clone远程仓库到制定目录
$ clone
某个分支
$ git clone -b "
分支名
" "
仓库地址名
"
$ git push origin --delete dev2 删除分支
三、分支
$ git branch
分支名
创建分支
$ git checkout
分支名
切换分支
$ git checkout -b
分支名
创建并切换到分支下
$ git push origin
本地分支名
:
远程分支名
将分支推送到远程仓库
$ git push
(
-u
)
origin
远程分支名
将当前分支推送到远程仓库的分支下,没有就创建
$ git pull origin
远程分支
:
本地分支
从远程仓库拉取代码到本地分支进行合并
$ git branch
查看本地分支
$ git branch -r
查看远程分支
$ git branch -a
查看所有分支
$ git log
查看历史日志
$ git reflog
查看历史命令
四、git版本恢复:reset、revert
reset: --mixed
默认方式
它回退到某个版本,只保留源码,回退
commit
和
index
信息
--soft
回退到某个版本,只回退了
commit
的信息,不会恢复到
index file
一级。如果还要提交,直接
commit
即可
--hard
彻底回退到某个版本,本地的源码也会变为上一个版本的内容
(一)
.
本地
commit
错误没有
push
到远程仓库
eg
:$
git reset —hard
版本号
(二)
.
如果我们某次修改了某些内容,已经
commit
到本地仓库,而且已经
push
到远程仓库了
eg
:$
git reset —hard
版本号
$ git push origin
远程分支名
-f
强制提交到远程仓库
eg: $ git push origin master -f
回滚远程仓库代码
$ git revert
版本号
$ git push origin
远程分支名
eg: $ git push origin master
git revert
是用一次新的
commit
来回滚之前的
commit
,
git reset
是直接删除指定的
commit
revert 和reset的区别
第一:上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会.
第二:如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.
第三:reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.
五、pull、push、fetch
git pull
取回远程主机某个分支的更新,再与本地的制定分之合并。
git pull <
远程主机名
> <
远程分支名
>:<
本地分支名
>
eg
:
git pull origin next:master
取回
origin
主机的
next
分支,与本地的
master
分支合并
如果远程分支是与当前分支合并,则冒号后面的部分可以省略
eg
:
git pull origin next
取回
origin/next
分支,再与当前分支合并。实质上,这等同于先做
git fetch
,再做
git merge
0.
$ git fetch origin
0.
$ git merge origin/next
建立追踪关系
$ git clone
会自动建立追踪关系
git
也允许手动建立追东关系
$ git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
如果远程主机删除了某个分支,默认情况下,
git pull
不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致
git pull
不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数
-p
就会在本地删除远程已经删除的分支。
0.
$ git pull -p
#
等同于下面的命令
0.
$ git fetch --prune origin
0.
$ git fetch -p
git push
命令用于将本地分支的更新,推送到远程主机
git push <
远程主机名
> <
本地分支名
>:<
远程分支名
>
如果省略远程分支名,则表示将本地分支推送与之存在
"
追踪关系
"
的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push origin master
上面命令表示,将本地的
master
分支推送到
origin
主机的
master
分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
0.
$ git push origin :master
#
等同于
0.
$ git push --delete origin master
上面命令表示删除
origin
主机的
master
分支。
2
)如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
$ git push origin
上面命令表示,将当前分支推送到
origin
主机的对应分支。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push
3
)上面命令表示,将当前分支推送到
origin
主机的对应分支。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push -u origin master
上面命令将本地的
master
分支推送到
origin
主机,同时指定
origin
为默认主机,后面就可以不加任何参数使用
git push
了。
不带任何参数的
git push
,默认只推送当前分支,这叫做
simple
方式。
此外,还有一种
matching
方式,会推送所有有对应的远程分支的本地分支。
Git 2.0
版本之前,默认采用
matching
方法,现在改为默认采用
simple
方式。如果要修改这个设置,可以采用
git config
命令。
0.
$ git config --global push.default matching
0.
#
或者
0.
$ git config --global push.default simple
4
)还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用
--all
选项。
$ git push --all origin
将所有本地分支都推送到
origin
主机。
5
)如果远程主机的版本比本地版本更新,推送时
Git
会报错,要求先在本地做
git pull
合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用
--force
选项。
$ git push --force origin
上面命令使用
--force
选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用
--force
选项。
6
)最后,
git push
不会推送标签(
tag
),除非使用
--tags
选项。
$ git push origin --tags
$ git fetch
$ git fetch <
远程主机名
>
更新某个远程主机的更新
$ git fetch
要更新所有的分支,将某个远程主机的更新,全部取回本地
默认情况下,
git fetch
取回所有分支的更新。如果只想取回特定分支的更新,可以指定分支名,如下所示
-
$ git fetch <
远程主机名
> <
分支名
>
比如,取回
origin
主机的
master
分支。
$ git fetch origin master
此外,也可以使用
git merge
命令或者
git rebase
命令,在本地分支上合并远程分支。
$ git merge origin/master
#
或者
$ git rebase origin/master
上面命令表示在当前分支上,合并
origin/master
。
六、merge
合并某个分支到当前分支
合并分支:
version.2
到当前分支(
master
),如下
-
$ git branch
$ git status
$ git merge version.2
$ git merge
命令用于将两个或两个以上的开发历史加入(合并)一起。
eg
:合并分支
fixes
和
enhancements
在当前分支的顶部,使它们合并
$ git merge fixes enhancements
eg
:合并
obsolete
分支到当前分支,使用
ours
合并策略:
$ git merge -s ours obsolete
eg
:将分支
maint
合并到当前分支中,但不要自动进行新的提交:
$ git merge --no-commit maint
eg
:将分支
dev
合并到当前分支中,自动进行新的提交:
$ git merge dev
七、stash 只针对暂存区的文件(切换分支时,保留修改到暂存区)
$ git stash
$ git stash list
查看
stash
列表
$ git stash save "work in progress for foo feature"
(推荐
多次
stash
后)
$ git stash save -u "messeag"
加入了代码新文件的开发的
stash
从保留区恢复:
$ git stash pop
其对应的
stash
在队列中删除
$ git stash apply stash@{1}
(或
git stash pop stash@{num}
)
pop
与
apply
区别:
apply
不在
stash
队列删,其他和
git stash pop
完全一样
删除:
$ git stash clear
清空
stash
队列
$ git stash drop <stash@{id}> git checkout . #
本地所有修改的。没有的提交的,都返回到原来的状态
git stash #
把所有没有提交的修改暂存到
stash
里面。
八、将远程分支代码合并到本地分支
eg:
git pull origin next:master
取回
origin
主机的
next
分支,与本地的
master
分支合并
$ git pull
就相当于执行了如下命令:
$ git fetch
$ git merge next
九、将本地分支代码推送到远程分支
eg:
$ git commit -m “commit”
$ git push <
远程主机名
> <
本地分支名
>:<
远程分支名
>
$ git push origin localBranch:remoteBrance
将本地localBranch分支推送到远程remoteBrance分支
十、rebase 取出
git rebase remote branchname
将主干分支更新合并到本地开发
对工作区中文件的修改分为三种情况:
(1)修改,但没有用git add将修改添加到暂存区;
(2)修改,已经使用git add将修改添加到暂存区;
(3)修改,已经使用git add将修改添加到暂存区,并再次进行修改;
对于第一种情况,直接使用git checkout -- 文件,即可撤销修改,撤销修改就回到和版本库一模一样的样子。
第二种情况,先使用git reset HEAD -- 文件,然后在使用git checkout -- 文件进行修改撤销。
第三种情况 先使用git checkout -- 文件,文件就会变成添加到暂存区后的状态,也就转换成了“第二种情况”,然后,在使用情况(2)中的处理方法,即可将文件恢复到与版本库一致的状态。
总之,记住一点:“git checkout -- 文件”命令,撤销的是工作中文件的修改,而“git reset HEAD -- 文件”命令,撤销的是暂存区中文件的修改。