git 学习-补充

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分支;
	把代码合入到这个分支上来,后面就在这个上面修改提交就行。
发布了126 篇原创文章 · 获赞 42 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/gaopinqiang/article/details/105081856