Android Studio自带代码托管工具git常用命令及解决自己代码冲突问题
git常用命令的使用流程(依次执行即可):
git status ./ 查看本地当前文件的变化;
git add ./ 将当前本地变化的文件添加到本地仓库(因为有.ignore文件所以可以全部添加);
git pull 将远程仓库的代码pull下来到本地仓库,并且查看是否与本地修改的文件有冲突
git commit -m "添加提交的代码说明" commit 提交代码;
git push 最后再将本地代码推送到远程仓库;
下面有一个具体的git远程仓库的创建和使用的教程:哔哩哔哩网站搜索喜马拉雅项目毕业设计教程第二节第12分钟:
对于自己写的代码,由于工作量考核的原因每天必须上传到远程仓库,但是由于自己对于某些问题有了更好的解决方案,代码重构什么的,会修改本地的已经push到远程仓库的代码,这时你在pull的时候是不会成功的,因为远程的代码和你本地修改后的代码不一致,有冲突。报错如下,下面来看解决方法:
git pull的时候发生冲突报错如下:
“AppledeMacBook-Pro:trunk apple$ git pull
Updating 6901211..1f2e01f
error: Your local changes to the following files would be overwritten by merge:
app/src/main/java/com/****c/ui/****center/floor/***ListAdapter.java
Please commit your changes or stash them before you merge.
Aborting
AppledeMacBook-Pro:trunk apple$
”
目前git的报错提示已经相关友好了,可以直观的发现,这里可以通过commit的方式解决这个冲突问题,但还是想看看其他大佬是怎么解决这类问题的,在网上查了资料和其他大佬的博客,得到了两种解决方法:
方法一、stash三部曲:
在没执行git stash之前,执行git pull,代码冲突导致中断pull过程,并报错:
error: Your local changes to the following files would be overwritten by merge:
app/src/main/java/com/jsmcc/ui/messagecenter/floor/MsgListAdapter.java
Please commit your changes or stash them before you merge.
Aborting
第一步:执行 git stash
AppledeMacBook-Pro:trunk apple$ git stash
Saved working directory and index state WIP on master: 6901211 首页修改更新 消息有效时间
git会备份当前的工作区的内容到git栈,以便后续恢复,这步很重要且必须,不然所有的代码重构、修改都白费。
第二步:git pull 或者 git pull origin master
有了第一步,这时pull可以顺利执行,会从远程仓库拉取你同事开发上传的代码,和你之前开发的老旧的代码,如下记录:
AppledeMacBook-Pro:trunk apple$ git pull
Updating 6901211..35675f0
Fast-forward
app/src/main/java/com/***c/***manager/***Manager.java | 23 +
app/src/main/java/com/***** | 45 +
git pull执行完之后,你再看你的项目代码目录,你会发现你新添加的文件、已修改的文件内容都被刚才拉取下来的远程仓库上你之前上传的老版本的代码覆盖了,而这些代码正是你不想要的和想修改的。莫慌,最关键的第三步来了。
第三步: git stash pop
执行第三步后,git会将你第一步备份到git栈中最新文件、最新内容和备份时当前工作区的文件状态恢复到当前工作区,刷新你的项目代码目录,一切新东西都回来了,旧东西又被删除了(你在重构代码时删除的文件和修改的文件,被第二步pull回来的文件将被删除,新修改的文件也将被重新恢复)
AppledeMacBook-Pro:trunk apple$ git stash pop
Auto-merging app/src/main/java/com/*****c/****/***center/****r/****Adapter.java
Auto-merging app/src/main/java/com/***cc/***/****center/adapter/****Adapter.java
//这里是你重构代码时删除的文件,被第二步的git pull还原后,被第三步git stash pop 删除的记录
Removing app/src/main/...../***.java
Removing app/src/main/...../***.java
Removing app/src/main/.....
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
//这里是恢复你重构后新添加的文件的恢复记录
new file: app/src/main/java/******Activity.java
new file: app/src/main/j******/Adapter.java
new file: app/src/main/j******/Util.java
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: app/src/main/AndroidManifest.xml
modified: app/src/main/java/com/***.java
deleted: app/src/main/java/com/***.java
deleted: app/src/main/java/com/****.java
modified: app/src/main/java/com/******.java
deleted: app/src/main/*****.java
接下来diff一下此文件看看自动合并的情况,并作出相应修改。
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
方法二、放弃本地修改,直接覆盖,相信这是没人需要的
1 git reset --hard 2 git pull