一、本地资源第一次推送到远程仓库
进入到一个目录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 在队列中删除
pop 与apply 区别:apply不在stash队列删,其他和git stash pop 完全一样
删除:
$ git stash clear 清空stash队列
$ git stash drop <[email protected]{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 -- 文件”命令,撤销的是暂存区中文件的修改。