创建一个新的分支
git checkout -b my-test //在当前分支下创建my-test的本地分支分支
向远程仓库推送一个新的分支
思路是在本地仓库新建一个分支(此分支的名称要跟远程一致),然后再将这个分支推到远程仓库
git checkout -b my-test //在当前分支下创建my-test的本地分支分支
git push origin my-test //将my-test分支推送到远程
git branch --set-upstream-to=origin/my-test //将本地分支my-test关联到远程分支my-test上
git branch -a //查看远程分支
修改默认的编译器
git config --global core.editor vim
从远程仓库获取某个分支(的代码)
已有本地仓库
git checkout -b branchA origin/branchB
其中branchA为远程分支,branchB是拉到本地后希望它的名字,在网络条件不好的情况下可以:
git fetch origin branchA:branchB --depth=1
尚未有本地仓库
git clone -b <指定分支名> <远程仓库地址>
例如:
git clone -b v_controller http://xxxxxxxxxxxxxxxxxxxxx.git
同样在网络条件不好的情况下可以,加 --depth=1来只获取最近一次提交(最新)的代码
删除本地或者远程仓库的分支
删除本地分支:
git branch -d 分支名
此命令执行时,如果该分支有尚未合并或地commit的文件,会失败,如果要强行删除需要用下面这个命令.
强制删本地:
git branch -D 分支名
删除远程分支:
git push origin --delete 分支名
如:
git push origin --delete my-validation_controller
向远程仓库上提交代码的一些经验和方法
提交pull request到devel
第一步 压缩commit
新分支只允许有一个commit来方便追踪,使评分的纪录保持清析,这时候首先要将要提交的分支例如need_to_push分支,如果有多个commit,需要合并成一个commit,步骤如下:
1.选择要压缩的commit
git checkout need_to_push
git log
git rebase -i HEAD~4(代码要将几个最新的commit合成一个,其中最老一个commit是不能合并的)
2.修改第2-4行的第一个单词pick为squash,这个意义为将最后三次的提交压缩到倒数第四次的提交,效果就是我们在pick所在的提交就已经做了4次动作,但是看起来就是一次而已。
3.保存退出,git会一个一个压缩提交历史,如果有冲突,需要修改.修改的完成之后:
git add 修改的文件
git rebase --continue
如果你想放弃这次压缩的话,执行以下命令:
git rebase --abort
4.如果所有冲突都已经解决了,需要修改一下合并后的commit的描述信息.
5.保存退出,合并commit完成.
压缩comit的方法详情请参考:https://blog.csdn.net/itfootball/article/details/44154121
第二步 往远程仓库上推送代码
推到远程仓库上的分支目的是要合并到主分支上的,合并的时候,该分支一定要比当前的主分支新,否则是合并不成功的。所以为了保证如合并成功,一定要保证这个需要上传的分支是在最新的主分支上完成的修改。
为了满足这种条件,我使用的思路:删除本地的主分支,从远程仓库上获取到最新的主分支,然后将need_to_push合并好的唯一一次commit cherry-pick到主分支上(这个过程可能会有冲突,需要去解决),最后编译,一定要编译,一定要编译,要不然一旦出了错会很尴尬。编译成功会后将这个主分支推送到远程仓库上(如果没有权限提交主分支的代码,可以以当前主分支在本地建一个新的分支,然后将新的分支推到远程仓库上,让有权限的人去合并到主分支上)。
具体的步骤:
1.删除本地的主分支 从远程fetch获取最新的主分支
git checkout need_to_push
git branch -D devel(上一步是为了保证在删除的时候,不在当前分支上)
git fetch origin devel:devel --depth=1(网络不好加上depth选项,这里确实只需要最新的,所以也没事)
git branch (查看上一步操作是否成功)
2.将commit cherry-pick 到本地的devel上
git log 查看need_to_push的commit id ,假设为d58b14dce8a
git checkout devel
git cherry-pick d58b14dce8a(如有冲突解决一下,参考https://blog.csdn.net/fightfightfight/article/details/81039050)
3.编译!!!
make
4.上传到远程仓库
适用于远程没有的分支:
git checkout -b my-test //在当前分支(主分支)下创建my-test的本地分支分支
git push origin my-test //将my-test分支推送到远程
适用于远程已经有的分支:
git push -f origin need_to_push(,这个方式理论上能成功,但是我没有试过)
最后,如果上传到远程仓库后,在合并的时候还提示不是最新的主分支(在上述操作过程中有人上传过代码)怎么办?
没事,再来一遍就是了,重新拉最新的主分支, cherry-pick need_to_push的那次commit,然后编译再上传.
设置和查看追踪
设置当前分支跟踪远程分支origin/serverfix
git branch -u origin/serverfix
查看本地分支和远程分支的跟踪关系
git branch -vv
git fetch
方法一
使用如下命令:
git checkout -b 本地分支名x origin/远程分支名x
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
方式二
使用如下命令:
git fetch origin 远程分支名x:本地分支名x
使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
采用此种方法建立的本地分支不会和远程分支建立映射关系。
推荐使用第一方式,因为自动建立了关联联系,以后会省很多事,之前从远程拉取分支方法是不正统的。
git fetch的主要用法
git fetch origin master:tmp
在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
git diff tmp
来比较本地代码与刚刚从远程下载下来的代码的区别
git merge tmp
合并temp分支到本地的master分支
git branch -d temp
如果不想保留temp分支 可以用这步删除
参考:https://www.ruanyifeng.com/blog/2014/06/git_remote.html
Git Pull push 只对当前分支操作
git pull <远程主机名> <远程分支名>:<本地分支名>
git push <远程主机名> <远程分支名>:<本地分支名>
Git 删除某一个commit
1,查看地当看log
git log
找到要删除的提交 Id ( 简写为 Id-a) 之前一次 提交的 Id (简写为 Id-b);
2,rebase 操作
git rebase -i Id-b
表示回退到之前的版本,并在之后会提交需要的所有提交。
3.删除要删除的提交(skip 变成 drop 或者 删除想要删除的那一行),并保存退出。
4.将本地的修复推送到远端
git push origin branch-name --force
备注:可能存在 git rebase --continue 提示,按照提示执行即可。
Git --force 用法
git pull origin add_control_validators:add_control_validators --force
无论是push还是pull,加了–force相当于,把本地的版本删除,把远程的分支拉下来覆盖,
同理push也是一样。这种操作是不安全的,在多人协作的分支,要谨慎使用。
撤销add和commit
撤销add
git reset
撤销commit
git add . //添加所有文件
git commit -m “本功能全部完成”
执行完commit后,想撤回commit
这样操作:
git reset --soft HEAD^
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
–soft
不删除工作空间改动代码,撤销commit,不撤销git add .
–hard
删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。
删除untrack files
git clean -f
更改分支名
git branch -m oldName newName