24、遇到一个“You have not concluded your merge (MERGE_HEAD exists).” 错误
背景:
a.首先在master分支有两个文件,修改后commit
b.切换到dev分支,同时修改这两个文件,尽量让两个文件合并冲突
c.切换到master分支,进行分支合并
d.这个时候会弹出冲突提示框,需要我们手动解决冲突。
e.此时我们不想合并了,直接点击close。
f.这个时候文件就是冲突的状态,我们需要撤销。
g.右击工程---Git---Revert... , 这个时候我们就撤销了,但是这个时候是Merging master的状态。
h.再次合并分支的时候就合并不了,提示上面那个错误。
解决方法:
第一种:
我们可以先切换一下其他分支,再切回来就好了。
第二种:
可以在Version Control标签中,右击Log中的一个版本记录,右击CheckOut Revision
这个时候git指向的是一个游离状态,再切换回master分支就可以
第三种:
直接点击VCS---Git---Reset HEAD... ,这个时候就退出了Merging master的状态了。
25、进行分支修改问题,修改完一定要commit
背景:我们当前在master分支,现在需要创建一个分支临时修改一个问题。
首先创建一个分支,修改完之后没有commit,切换到master分支之后,发现文件也被修改了。
所以,我们在临时分支上修改完成之后需要commit一次,再切回来master分支就不会被修改。
26、临时分支合并主分支的部分功能
暂时的解决方法是,通过对比branch,然后手动合并后commit
27、回退到以前的某个版本,如果又想前进到当前版本操作:(这个非常常用,非常重要)
每个版本修改记得commit一次。
master version4 e433f98
master version3 b8fcc06
master version2 2977c2a
master version1 fa68b58
每个版本对应的版本号可以通过 git reflog查看到,很实用。
现在我们所在的版本为version4,我们想回退到version1
a.VCS --- Git --- Reset HEAD... 出现弹框
b.在To Commit 输入 HEAD~3 或者输入 fa68b58 ,点击“Validate”可以查看这个是不是你要回退的版本
c.默认选择 Mixed模式,点击“Reset”,我们这个时候发现Log里面的指示就指向master version1这个提交了。
d.此时的代码并没有回退回来,我们想把这个工程的这个版本回退回来,选中工程,VCS --- Git --- Revert... ,点击Revert就可以把代码也回退到这个版本了
现在我们怎么回到version4呢?
找了半天找不到前进的选项,这个时候我们可以通过git reflog 命令,查看到version4的版本号。
用版本号进行和上面相同的操作就可以回到version4了。
使用HARD模式,commit和代码都会回退。但是也可以使用上面的方法恢复。
28、Stash Change… 和 UnStash Change…的用法:
有这样一个场景:我们在当前master分支开发代码,突然需要切换到dev分支去修改一个bug。我们当前有很多的修改没有commit提交,因为还没写完commit版本编译会有问题。
如果我们不commit就切换分支,会出现需要合并很多的文件操作,如果你直接Revert,那么你修改的代码都没了!!!
a.这个时候我们可以使用Stash Change...功能,将当前的开发代码保存起来,又可以直接切换分支修改bug。
VCS --- Git ... Stash Change... 给你的stash取个名字,点击创建。这个时候你的代码会撤销到上一次的commit状态。不用慌,正常。
b.切换到其它分支修改完成之后,再切换回master分支
VCS --- Git ... UnStash Change... 选择你刚才的保存就可以继续开发了。开发完成commit就可以。
注意:如果你没有commit代码就强制去切换分支,会提示你合并代码到你切换的分支,Smart Checkout。
这个时候会自动生成一个UnCommitted change的stash
29、遇到一个很奇怪的问题:
我开了Android studio 和pycharm,两个都使用了git管理。我在编译的时候报一个下面这个错误
* What went wrong:
Timeout waiting to lock task history cache (D:\git\smarthome\.gradle\2.14.1\taskArtifacts). It is currently in use by another Gradle instance.
Owner PID: 17064
Our PID: 15104
Owner Operation: Create file snapshot
Our operation: Create file snapshot
Lock file: D:\git\smarthome\.gradle\2.14.1\taskArtifacts\cache.properties.lock
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
网上搜索的解决方案说:.git文件夹中的cache删除再编译就行,或者电脑重启。
我的解决方案:删除cache再编译是不行的,需要重启电脑。听说这是gradle的一个bug
30、回退add操作
我们在命令行中add一些文件,如果我们不想去commit这些文件可以使用
【git add .】添加了所有文件
【git reset head】这个是回退所有的添加文件
【git reset head readme.txt】只回退单个的add文件
这个时候文件就从绿色变为红色了,表示未被追踪的状态
如果add后又commit了,可以使用
【git reset head】或者【git reset commitid】
如果也回退代码【git reset --hard commitid】
31、git pull的时候出现“Please move or remove them before you merge.”
本地的修改和服务器有冲突,我们如果想用服务器的代码,就清除本地的代码
命令【git clean -df】,删除文件和目录
32、使用【git diff】打两个分支之间的patch
我当前的分支是new_dev_soft
目标分支是 new_dev
【两个分支之间】
git diff 94a8e43(当前的分支,例如master) c52146a(目标分支,例如dev) > test.patch
这样我们就生成了一个两个分支之间的patch
这样我们在master分支,git apply test.patch就可以将dev的代码通过patch合入到master里面来了
注意:这样合入测试,会把本地修改的删掉
【两个commit之间】
git diff cd64bb5(基准的commit) fc35740(目标commit) > test.patch
我们可以切换到基准的commit后,再git apply test.patch ,就可以让代码变为目标的commit代码了。
注意:如果在目标commit上直接apply就会出现重复,可以revert回退
两个分支之间打patch最好的做法是:
在dev分支上修改,修改完成后commit提交。切换到master分支,将dev分支合入merge到master分支,这个时候不要去commit,直接去create patch。
这个patch就是你的master和dev的修改。
我们在master分支上,revert将代码回退到前一次commit的地方,apply这个patch就是合入的patch了。把这个patch给别人,别人也可以同步了dev的修改点了。
33、从一个分支同步一个文件到当前的分支上来(当前分支是没有这个文件的)
cd到你要放到的目录
git checkout dev_old -- ScanDeviceBean.java (dev_old目标分支,目标文件)
34、同时使用git和subversion管理项目代码
svn直接checkout下来就可以了
git管理可以在Android Studio中的Settings --- Version Control
将需要管理的模块设置为Git
35、将本地修改的代码提交到beta合入的步骤:
1.在test上将主仓库的代码fork到自己的账号下(主仓库地址:http://test-dg.hw.com/HwBeta/Test_Apk.git)
2.切换到你需要开发修改的分支(例如:beta),修改完成。
3.将本地的代码和主仓库的代码同步(非常重要)
开始的时候我们本地的代码和主仓库的代码是没有关联的,此时使用【git remote -v】
origin http://test-dg.hw.com/gq/Test_Apk.git (fetch)
origin http://test-dg.hw.com/gq/Test_Apk.git (push)
我们使用【git remote add upstream http://test-dg.hw.com/HwBeta/Test_Apk.git】 关联主仓库的代码。此时使用【git remote -v】
origin http://test-dg.hw.com/gq/Test_Apk.git (fetch)
origin http://test-dg.hw.com/gq/Test_Apk.git (push)
upstream http://test-dg.hw.com/HwBeta/Test_Apk.git (fetch)
upstream http://test-dg.hw.com/HwBeta/Test_Apk.git (push)
我们再使用【git fetch upstream】拉取最新的主仓库代码
再使用【git merge upstream/beta】将远程仓库的beta分支代码合入到我们本地来
注意:其实我们不用命令使用VCS也可以操作,先关联远程主仓库---切换到upstream/beta分支---Update Project... --- 切换到我们开发的分支origin/beta --- 合并
这样我们就把主仓库最新的修改同步到我们本地来了
4.将我们自己修改的代码commit一下,commit到我们本地的仓库
5.将我们修改推到我们自己账号下的仓库中。
【git push】因为我们看到我本地的分支已经是和origin/beta是关联上的,所以直接git push 就行
当然也可以【git push origin beta】
6.这样进入我们自己账号下的仓库就是最新的主仓库代码+我们的修改
7.将我们的修改推送到主仓库合入,在test选择 +New M.R.
注意,我们如果推送错了,可以修改回来再推送
2019/06/12 Beta那边新建了一个WIFI_and_BT分支单独使用,我们把新建的分支推送到我自己的仓库方法:
先【git fetch upstream】这个时候本地分支就会多一个upstream/WIFI_and_BT远程分支出来;
在AS中选中upstream/WIFI_and_BT分支,点击【Checkout AS...】,新建一个本地分支【WIFI_and_BT】,这个时候我本地就会多出一个upstream/WIFI_and_BT分支;
切换到本地upstream/WIFI_and_BT,使用【git push origin WIFI_and_BT】,这个时候在网页中的个人仓库中就会新建一个分支;
切换到其他分支(例如:beta),删除upstream/WIFI_and_BT(因为现在是关联的upstream主仓库);
在AS中选中origin/WIFI_and_BT分支,点击【Checkout AS...】,新建一个本地分支【WIFI_and_BT】,这个时候我本地就会多出一个origin/WIFI_and_BT分支;
把代码合入到这个分支上来,后面就在这个上面修改提交就行。