Git-查看远程分支、本地分支、创建分支
1.查看本地分支
$ git branch * br-2.1.2.2 master
2.查看远程分支
$ git branch -r origin/HEAD -> origin/master origin/feature/IOS_visualtrack origin/feature/android_visualtrack origin/master
3.查看所有分支
$ git branch -a * br-2.1.2.2 master remotes/origin/HEAD -> origin/master remotes/origin/br-2.1.2.1 remotes/origin/br-2.1.2.2 remotes/origin/br-2.1.3 remotes/origin/master
4.切换远程分支
$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/Release remotes/origin/master $ git checkout -b myRelease origin/Release Branch myRelease set up to track remote branch Release from origin. Switched to a new branch 'myRelease'
PS:作用是checkout远程的Release分支,在本地起名为myRelease分支,并切换到本地的myRelase分支
5.合并分支
合并前要先切回要并入的分支
以下表示要把issue1234分支合并入master分支
$: git checkout master $: git merge issue1234 Merge made by recursive. README | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
6.撤消上一次commit的内容(该操作会彻底回退到某个版本,本地的源码也会变为上一个版本的内容)
git reset --hard <commit-id>
以下表示要撤消“update build gradle configuration file”这一次的commit id,返回到"add battery settings ui"这一次的commit id,
xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((c8303a9...)) $ git log commit c8303a9e8db2bcf4edb7488e722a380f4e8858ec (HEAD) Author: xp.chen <xp.chen@yuneec.com> Date: Sat Oct 28 09:28:51 2017 +0800 update build gradle configuration file Change-Id: I9ee532fd0d4698613698a64eb754fb98a8559e32 commit 8d8e5ccf24cf6836ab780aa3860270c3876e825a Author: xp.chen <xp.chen@yuneec.com> Date: Sat Oct 28 09:02:01 2017 +0800 add battery settigns ui Change-Id: Ia907ee4e84f54c00a186d31378a7925a6adaba0e xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((c8303a9...)) $ git reset --hard 8d8e5ccf24cf6836ab780aa3860270c3876e825a HEAD is now at 8d8e5cc add battery settigns ui xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((8d8e5cc...)) $ git log commit 8d8e5ccf24cf6836ab780aa3860270c3876e825a (HEAD) Author: xp.chen <xp.chen@yuneec.com> Date: Sat Oct 28 09:02:01 2017 +0800 add battery settigns ui Change-Id: Ia907ee4e84f54c00a186d31378a7925a6adaba0e
7. git commit -m 注释换行
git commit -m 注释可以通过单引号来换行,比如:
$ git commit -m ' > 1.aaaaa > 2.bbbb > ' [master b25154b] 1.aaaaa 2.bbbb 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ss.txt
通过git commit --amend 命令可以查看到刚刚的log信息为
1.aaaaa 2.bbbb
Beyond Compare代码比较工具使用
合并代码前,先比较待合代码和远端代码的不同,确定哪些代码需要合。
- 红色为有区别的文件(右键复制到右边,右箭头复制到右边)
- 紫色为有不同的目录
- 不等于号是需要修改的,约等于号主要是注释或格式不同,可不修改
Git 合并代码流程
1、先fork远端库(自己账户下会创建与远端库完全相同的个人库),然后将个人库clone到本地:执行git clone操作, 所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是本地的master分支自动“追踪”origin/master分支;因此,git clone执行后,git remote -v可以看到已经有分支输出。
git clone ssh://xxx.git
2、进到本地目录, git remote -v:查看远端库3、将要合并的远端主库添加到远端库列表:
git remote add top ssh://xxx.git
git remote -v:可以看到多了远端top(top表示远端主机名,而不是远端分支名; 默认有个master分支)
$ git pull top master
remote: Counting objects: 173, done.
remote: Compressing objects: 100% (149/149), done.
remote: Total 173 (delta 90), reused 0 (deRecltaeiving objects: 45% (78/1 0)
Receiving objects: 100% (173/173), 105.75 KiB | 0 bytes/s, done.
Resolving deltas: 100% (90/90), completed with 28 local objects.
From ssh://xxx
* branch master -> FETCH_HEAD
* [new branch] master -> top/master
Updating 2936c86..7a0181c
error: Your local changes to the following files would be overwritten by merge: xxx.js
Please commit your changes or stash them before you can merge.
Aborting
从远端拉代码到本地报错,因为本地的修改和远端新代码修改冲突了.
5、将未提交的本地修改先暂存:
git stash
6、再从远端拉代码:
git pull top master
7、恢复本地修改:
$ git stash pop
Auto-merging xxx.js
On branch master
Your branch is ahead of 'origin/master' by 14 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
...
Untracked files:
(use "git add <file>..." to include in what will be committed)
...
Auto merge表明远端代码和本地修改合并成功;若出现error,多半是他人合并的修改和自己的修改冲突了(即修改的同一文件),此时手动修改文件(删除>>>和<<<)可解决冲突.8、添加所有修改:
git add .
git status:可查看提交修改前后的状态
9、提交修改:
git commit -m "xxxx"
10、将本地库推到个人远端库:
git push origin master
11、codeclub网站新建合并请求
Merge Requests -> New Merge Request -> 选择个人远端库分支、主库分支 -> Compare branches and continue -> 选择合并人即可.进入个人远端分支库, 选择Merge Requests,分支名选master,合并的目的远端主库选add top对应的库.
简化步骤:
- 1、git clone fork后自己的远端库链接非主库并cd到该目录下
- 2、若没有添加远端主库,则添加远端主库 git remote add top 远端主库链接git remote -v:查看远端主库
- 3、将远端主库最新的代码拉到本地库git pull top(远端主库) master(远程分支名)
- 4、手动对目录代码进行修改后,添加所有修改git add .git status
- 5、提交修改git commit -m "修改描述"
- 6、将本地库推到个人远端库git push origin(个人远端库名) master(本地分支库名)
- 7、登录个人远端库,新建合并请求
常见git命令:https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
修改已提交的commit描述:https://www.jianshu.com/p/098d85a58bf1
非本地Master仓库修改代码,合入远程主库
解决办法1:
- 1、若本地没有git仓库,先fork远端主库,然后在fork的个人远端库Settngs -> Members -> 搜索public FuXiCodeServ 角色选"Master",再点击Add to project.git clone xxx.git
- 2、cd 到 本地clone的根目录
- 3、git remote add top 远端主库链接
- git remote -v
- 4、将远端top主机的master主库最新的代码拉到本地:
- git pull top master 或 git pull top master --rebase
- 5、用Compare Beyond工具,比较代码编辑目录的文件(修改过的文件)和本地master库目录的文件,将修改过的部分添加到master库文件中,以解决冲突(master库中有,编辑目录中没的无需处理,只处理冲突).并将编辑目录中添加的文件拷贝到master库目录中.
- 6、提交修改
- git status
- git add .
- git commit -m "单号 描述"
- git log
- 7、推到远程个人仓
- git pull top master --rebase:push前再拉一次检查是否有冲突;若还有冲突用IDE修改master的冲突文件(里面会有>>或<<标识冲突),然后git add .,最后用git rebase --continue合并冲突即可。
- git push origin(个人远端库名) master(本地分支库名) (若报错慢于主库,则可以加--force)
解决办法2:
- 1、本地master拉远端库;
- 2、创建与远端分支相同的本地分支:git checkout -b 本地分支名 远程仓库名/远程分支名;
- 3、添加配置文件等与远端库不一样的运行所需文件;
- 4、git stash:将配置部署所需文件的添加修改保存下来;
- 5、git stash apply:将保存的修改重新应用到本地分支(git stash pop会删除最新一次的缓存;而git stash apply是复制一份最新的缓存而不会删除,这样下次还可以继续使用该缓存);
- 6、git add .:将此次配置文件的添加修改add,这样下次git stash就不会将add过的修改保存下来。修改调试本地分支的代码;
- 7、git stash:将本地分支的代码修改保存到最新一次的缓存中;(git stash貌似会将当前未add过的修改保存下来,当前工作空间将不再有该修改,若切换工作空间前不保存修改,则当前工作空间的的修改将丢失.若修改未提交即使add了,切换工作空间修改也会丢失,前面的add无效)
- 8、git checkout master:切换回master分支
- 9、git stash apply:将最新的缓存应用到本地master分支,即将代码修改应用到master;
- 10、git add .
- 11、git commit -m "描述":在本地master分支提交代码
- 12、git pull top master --rebase
- 13、git push 个人远端仓库名 本地分支名:远程分支名
下次修改代码可以直接使用之前保存的配置文件的添加修改:
- git pull 远端库名 远端分支名:本地分支名 / git pull 远端库名 本地分支名:将最新远端代码拉到本地分支
- git stash apply 配置添加修改缓存名:在新代码上应用配置文件的添加修改
- 修改调试本地分支的代码;
- 之后与前面相同.
解决办法3:
将配置文件的添加修改独立成远端某条分支的提交,然后每次需要使用配置文件时,利用git cherry-pick拉该分支合入到当前分支.
cherry-pick使用:https://blog.csdn.net/FightFightFight/article/details/81039050
本地Master仓库修改代码, 合入远程主库
- 1、检查分支情况
- git branch -vv
- git remote -vv
- git status
- 2、修改前
- git pull top master --rebase
- git log
- git log --oneline
- 3、在master上修改代码
- 4、修改后
- git status
- git add .
- git commit -m "描述"
- git log
- 5、推到远程个人仓
- git pull top master --rebase
- git checkout -b xxx(本地分支名,分支名最好根据问题单取名,远端个人仓分支名与这个相同)
- git branch -vv
- git remote add 个人远端仓库名 个人远端仓库地址
- git push 个人远端仓库名 本地分支名:远程分支名 --表示将本地分支push到远端库的分支; 当本地分支名为空时,则表示删除远端分支.如果远端分支省略,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建.
相关命令:
- git branch -a:查看关联的远程分支
- git branch:查看本地分支(*表示当前分支)
- git checkout master:切换回master分支
- git stash list:查看缓存列表
- git stash apply stash@{2}:根据git stash list列举出的缓存名,应用更早的缓存(git stash同时具备堆栈和列表的特性)
- git checkout -b serverfix origin/serverfix:在本地创建与远程分支完全相同的分支,并切到本地新建的分支.
- git push <个人远端仓库名> <本地分支名>:<远程分支名>
- git pull <远程主机名> <远程分支名>:<本地分支名> (注意区别git push)
- git pull 或 git pulll --rebase:只有当前本地分支只有一个追踪分支时,远程主机名和远程分支名均可省略。对于git clone再执行git remote add的追踪分支数大于1,应当使用全部参数而不省略
git pull 报错:'Cannot pull with rebase'原因:本地有未暂存的修改解决:https://blog.csdn.net/u012385190/article/details/70670213
本地需求1已commit提MR但没合,现要搞另外一个新需求:
本地新建分支并与远端分支相同:checkout -b 本地新分支 远端库/远端分支
克隆仓库
访问主库,先Fork
Clone 主库
git clone xxx.git
查看仓库状态
# 显示所有修改状态
git status
# 显示远程库状态
git remote -vv
# 显示分支状态
git branch -vv
此时主库的别名为origin
添加fork仓库
git remote add fork xxx.git
此时自己仓库的别名为fork
查看本地分支追踪的上游分支
git branch -vv
master代表本地分支,后面的[origin/master]代表本地分支追踪的是origin的master分支
修改本地分支追踪的上游分支
一般本地分支一定要追origin的某个分支(否则pull更新不到其他人的代码),可以通过如下命令修改分支的上游分支
git branch -u origin/xxx
此示例表示将本地分支最终origin的gaia-0831分支
新建分支
默认本地是使用的master分支,如果在本地新建分支,可以使用
git checkout -b BRANCH_NAME
此分支是基于git本地当前分支创建的,不一定是服务端最新的代码
如果要创建一个和服务端相同的分支,可以使用
git checkout -b BRANCH_NAME origin/BRANCH_NAME
此时本地新建的分支BRANCH_NAME就是拉取服务端BRANCH_NAME的代码
代码修改
先更新本地代码到origin最新的分支
git pull --rebase
--rebase表示变基更新,如果本地有commit,此时会先将服务器的commit拉下来,然后基于服务端最新代码将本地commit
重新合入,保证本地不会出现merge的提交(当然,可能有冲突,另外解决)
修改代码,并commit
git add xxxxx
git commit
再次更新origin的内容
git pull --rebase
解决完冲突之后,提交到fork仓库
git push fork master:master
示例为将本地master分支提交到fork的master分支,分支名称可以任意
追加修改的文件到上一次commit
如果commit之后,还没有push到仓库前,发现还有文件要修改,且要与commit合并,此时可以
先修改文件
执行git add XXXX
将修改文件追加到上一次commit中
git commit --amend
在打开的窗口中修改提交信息,然后:wq保存即可
另外如果commit已push到fork库,但是没有合入origin库,可以按上述逻辑先将文件合入commit,然后强制push到fork库(注
意fork库上对应分支不能有自己其他提交,否则会覆盖丢失)
git push fork master:master -f
修改提交信息
如果commit之后,发现信息有误,可以执行
git commit --amend
在打开的窗口中修改信息,然后:wq保存即可
####合并多个本地提交
比如一个功能本地分为多次提交,最终push上库推荐合并为一个
首先查看本地提交日志
git log
查看自己有多少个提交需要合并
合并多个提交
git rebase -i HEAD~2
表示将本地前2个提交合并
此时会弹出需要合并的提交信息,第一个pick保留,剩余的pick改为s
将
pick a0c4b08f commit1
pick 2b106445 commit2
改为
pick a0c4b08f commit1
s 2b106445 commit2
按:wq保存,此时会另外弹出一个窗口用于编辑最终的提交信息,可以删除多余的内容(注意#是注释,实际不会提交上去),
填写最终的commit信息,然后:wq即可
查看是否合并
git log
本地暂存
当本地有修改东西,在没有commit之前,并不能pull服务端的代码。如要pull代码,且不提交本地修改,可以使用git的stash
功能
# 将本地修改全部暂存起来
git stash
# 查看本地暂存列表
git stash list
# 恢复本地暂存列表第一个提交
git stash pop
# 清空本地暂存列表
git stash clear
解决冲突
如在git pull --rebase时发生冲突,此时也有多种方法解决。
先回滚pull,另外找个目录Clone主库代码,使用Beyond Compare合并自己的代码到新库,然后在新库中commit与
push
git rebase --abort
在Intellij IDEA中,在项目根目录上邮件,点击Git,通过IDEA来合并冲突的文件
本地需求1已commit提MR但没合,现要搞另外一个新需求:
本地新建分支并与远端分支相同:checkout -b 本地新分支 远端库/远端分支
本地分支A的commit a, merge 到远端分支top/master后;想将commit a也merge到top/good分支(good分支代码与master分支不同):
1、本地新建与远端top/gaia相同的分支:git checkout -b newbranch top/good
2、应用commit a到newbranch:git cherry-pick commit-a-ID
3、再次更新远端代码到本地:git rebase -i top/good
git rebase -i远端分支时报错:
$ git rebase -i top/xxx
fatal: Needed a single revision
invalid upstream top/xxx
解决办法:
git fetch --all:将远端所有分支拉到本地
git rebase -i top/xxx
如果是撤销所有的已经add的文件:git reset HEAD .
如果是撤销某个文件或文件夹:git reset HEAD filename
删除中间某次提交:
1.git log获取commit信息
2.git rebase -i (commit-id)
commit-id 为要删除的commit的下一个commit号(即只编译该commitId的前几个commit,决定去留)
3.编辑文件,将要删除的commit之前的单词改为drop
4.保存文件退出大功告成
5.git log查看
撤销 git commit --amend:https://www.jianshu.com/p/97341ed9d89e
查看commit的内容:git show commit_id