GIT初使用
GIT仓库结构如下
1、clone远程分支到当前目录
git clone [url]
2、手动创建一个本地分支newtest
git branch newtest
3、列出你在本地的分支(结果显示*的分支代表当前分支)
git branch
查看所有分支:(本地+远程仓库分支)
git branch -a
结果带【ACDMRTUX?】表示不同意思
4、切换到本地 newtest 分支
git checkout newtest
5、创建本地分支newtest 并且切换到创建的分支
git checkout -b newtest = git branch newtest + git checkout newtest
6、要删除newtest 分支
git branch -D newtest 来删除一个指定的分支
git push origin -d newtest 删除一个远程分支
7、将newtest分支合并到当前分支
$ git merge newtest
8、文件比较
①比较工作目录和与暂存区
git diff
②比较暂存区与最新本地版本库
git diff --cached
③比较工作目录和与最新本地版本库
git diff HEAD
④比较工作目录和与指定commit-id的差异
git diff commitid
⑤比较暂存区与指定commit-id的差异
git diff --cached <commitid>
⑥比较两个commit-id之间的差异
git diff <commitid1> <commitid2>
9、要更新所有分支
git fetch
更新某个远程主机代码
$ git fetch <远程主机名>
10、git status 查看工作区代码相对于暂存区的状态,告诉你有文件被修改过
11、要合并其他分支到你的当前分支(例如 branch)
git merge <branch>
一般先fetch后merge
12、更新你的本地仓库至最新改动
git pull <远程主机名> <远程分支名>:<本地分支名>
将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master:brantest
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin master
git pull origin = git fetch origin + git merge origin
13、提交你的本地仓库最新改动到远程
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
$ git push origin master = $ git push origin master:master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push
14、①手动合并这些冲突(conflicts),执行如下命令以将它们标记为合并成功:
(git add files 把当前文件放入暂存区域, git commit 给暂存区域生成快照并提交)
git add <filename>
②将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录
git add .
15、文件撤销退回删除
①从缓存区中拉取版本还原,如果缓存区中没有该文件则再到版本库中拉取还原,将本地文件替换
git checkout -- <filename>(指定文件) OR git checkout .(当前所有) ≪=≫ 和 add(修改文件)操作方向相反
②git reset --soft HEAD^
本地版本的HEAD指向了指定版本(也就是版本库回退了),工作区和暂存区中的文件没有变化。就等于回滚到了git commit之前的状态。
③拉取版本库的文件到本地版本库暂存区,改操作不影响工作区
git reset HEAD -- <filename> (指定文件) OR git reset HEAD.(当前所有) ≪=≫ 和 commit操作方向相反
git reset HEAD^等同于git reset --mixed HEAD^命令,因为--mixed参数是命令的默认选项,也就是不写任何参数就默认使用参数。
本地版本的HEAD指针指向了指定版本(也就是版本库回退了),把暂存区中的文件也回退到了指定版本,而只有工作区中的文件内容没有变化,就等于回滚到了和git add之前的状态
④将工作区和暂存区恢复成HEAD版本库,此时工作区、暂存区、本地版本库中的文件状态都是一致的,为指定的版本状态
git reset --hard HEAD^
⑤删除暂存区里的文件(add后的文件),执行后不出现在在暂存区中
git rm --cache 文件名 ≪=≫ 和 add(新规文件)操作方向相反
⑥删除版本库中的文件。完全删除:本地删除后在提交;本地保留:add到缓存区中的文件进行rm --cache操作,在commit。
⑦删除暂存区和工作区的文件
git rm -f 文件名
⑧将add后的文件变为修改后非add状态
git reset 回退全部 ;git reset filename回退指定文件
16、你的仓库连接到某个远程服务器(并非直接开发的分支)
git remote add + 远端仓库所起的别名(一般都是叫upstream ,其实你也可以叫CC或者DD) + 你的远端仓库的真实地址
git remote add upstream <git@gitlab.....A>
你也可以同时关联多个远程链接
git remote add upstream2 <git@gitlab.....B>
17、推送代码到远程分支上:
以上面16的两个关联分支为例子,将一份已经写好的代码提交到两个git远端
git push origin <branch_A>
git push upstream <branch_B>
关联后第一次推送使用以下命令,可以指定为一个默认主机
git push -u upstream <branch_B>
之后就可以使用git push 命令直接推送,默认到 upstream <branch_B>分
18、查看关联分支情况
git remote -v
19、代码合并rebase
git rebase <branch>
注意①当前的分支追加到<branch> 分支后
②如果有冲突,解决冲突后执行:git add和git rebase --continue
③如果需要终止rebase,可以执行git rebase --abort
④rebase黄金定律:共享的public分支不能rebase
rebase原理↓:
20、代码合并merge
①git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master
②git checkout master
git pull
git checkout dev
git merge master
git push -u origin dev
21、git cherry-pick用法
如果你需要另一个分支的所有代码变动,就采用合并(git merge或者git rabase)。
你只需要另一个分支变动的部分代码(你想将一些提交复制到当前所在的位置),这时可以采用 Cherry pick。
①git cherry-pick 分支(或者commit的id号)
②如果代码有冲突
第一步将修改的文件重新加入暂存区
git add .
第二步使用下面的命令
git cherry-pick --continue
22、stash
注意:stash可用于临时保存和恢复修改文件(工作区和暂存区的文件),可跨分支操作,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。
①git stash 保存当前工作进度,会把暂存区和工作区的改动做一个备份保存,必须是处于git下的文件(git add 操作过的文件,新建未add过的不可)
②git stash -u 保存当前工作进度,会把暂存区和工作区的改动做一个备份保存,包含新建未add过的文件
③git stash save [message] 作用同上,message为此次进度保存的说明。
④git stash list 显示备份列表,每一条stash用stash@{n}标识,编号越小代表保存进度的时间越近。
⑤git stash pop 将当前stash中的内容弹出应用到当前分支(该命令将堆栈中最近备份的内容删除)。
⑥git stash pop stash@{num} 按照指定stash@{num}号弹出的第几条stash应用到当前分支(该命令将堆栈中最近备份的内容删除)。
⑦git stash apply 使用第一个备份应用到当前分支,即stash@{0}(该命令不会将内容从堆栈中删除)。
⑧git stash apply stash@{num} 按照指定stash@{num}号弹出的第几条stash应用到当前分支(该命令不会将内容从堆栈中删除)。
⑨git stash drop stash@{num} 丢弃指定的stash号的备份,默认丢弃最上面的那条,即stash@{0},此外还可以在drop后加stash@{n}来指定要丢弃的stash条目。
⑩git stash clear 删除所有保存的备份。
23、删除分支
①删除本地分支:
git branch -d 分支名(该分支必须完全和它的上游分支merge完成)
git branch -D 分支名(直接删除本地分支)
②删除远程分支:
git push origin -d branch(该指令也会删除追踪分支)
③在gitlab仓库上删除
24、分支的撤销变更
git reset通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 将本地当前分支记录向上移动到指定位置,原来指向的提交记录就跟从来没有提交过一样。但是这种“改写历史”的方法对大家一起使用的远程分支是无效。
git revert 对当前分支进行一次新的提交(revert的分支为要回退到的地方),达到撤销某些提交的目的,可以把你的更改推送到远程仓库与别人分享。
25、强制移动分支
git push -f c1 c2 将c1分支强制移动到c2分支那个位置
简单的代码提交流程
①git status 查看工作区代码相对于暂存区的差别
②git add . 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录
③git commit -m ‘注释’ 将缓存区内容添加到本地仓库
④git pull origin master先将远程仓库master中的信息同步到本地仓库master中
⑤git push origin master 将本地版本库推送到远程服务器,
origin是远程主机,master表示是远程服务器上的master分支和本地分支重名的简写,分支名是可以修改的
自己的工作流程
远程gitlab主分支 <=> 自己gitlab主分支 <=> 开发gitlab分支<=> 本地代码(eclipse)
①fork:在gitlib上fork远程主分支代码到自己的gitlib
②clone:clone自己的gitlib上的代码到本地,git clone <git@gitlab.....自己的的gitlib分支地址>
③切换指定开发分支(需要进入工程文件夹):git checkout develop1
④自己主分支和远程主分支创建联系:git remote add upstream <git@gitlab.....远程分支地址>
⑤确认地址:git remote -v 确认fork地址是否正确
⑥创建开发分支 git checkout -b feature/issues/###(可能有多个分支用来提不同的mr,每个分支重复以下的步骤操作)
更新远程主分支最新代码
⑦git checkout 自己主分支
⑧git pull upstream 远程主分支
⑨git chekout 自己开发分支(每次切换分支时前都要切到自己主分支进行代码更新)
⑩git rebase 自己主分支(git rebase myMaster, 将自己主分支(myMaster)代码合并到当前所在分支(myTest))
⑪push到自己的主开发分支,提MR
注意:自己主分支只用来更新远程分支的代码,并被自己的开发分支rebase,自己的开发分支用来开发和提MR
提MR的过程
⑫如果有冲突解决冲突(参照下面【自己遇到的问题:一,冲突】)
⑬git add
⑭git commit -m '注释'
⑮git push origin xxxx
⑯gitlib上提New Merge Request
⑰指定Source branch(自己的gitlib代码分支),Target branch(提mr的目标分支)
自己遇到的问题
一,冲突
①rebase后发现有冲突
②git status查看有冲突的文件
③本地解决冲突
④解决冲突后的文件 进行git add
⑤没有冲突了进行 git rebase --continue
⑥如果还有冲突重复②③④⑤
⑦直到没有冲突
二,多次代码需要合并到一个commit中
①改代码后进行了一次commit操作
②后续改代码不希望在mr中再出现一个commit中
③对改过的代码进行git add操作
④然后git commmit --amend
⑤如果不需要修改commit的注释,按ESC退出编辑模式,按 :wq! 保存并退出。
⑥如果想改commit的注释,按 i进入编辑模式修改,修改后按ESC退出编辑模式,按 :wq! 保存并退出。
⑦进行git push 操作(强制提交git push -f )
三,回退到上一次提交时的代码(你想撤销最新提交)
①git push origin m1后,又git push origin m2,本地现在和m2代码一致
②发现m2有问题不需要了,本地需要回到m1的代码
③git reset --hard HEAD^ 回退到上个版本
扩展:
git reset --hard HEAD^ 回退到上个版本
git reset --hard HEAD~3 回退到前3次提交之前
git reset --hard commit_id 退到/进到 指定的commit
git push origin HEAD -- force 强退至远程