git的一些疑问
git在切换分支的时候自动合并分支?
问 题
我新建了一个分支比如develop
git checkout -b develop
然后在这个分支下修改了文件内容。当我切回master分支的时候
git checkout master
发现master分支下的文件也被改了。请问是我的操作有问题,还是其他原因造成的呢?
解决方案
你修改东西后不commit在切换分支时会自动带过去。
你现在切回develop, 修改还会自动带过去的。 但有些情况是不提交会出现(文件被删除,修改被重置等情况)
切换分支时都要commit或stash当前的工作区
git delete remotes: remote refs do not exist
今天用git branch -av 命令看了一下,服务器上有一大堆的分支,大部分已经合并到master了。决定清理一下。
git push --delete origin myBranch
错误
error: unable to delete 'yh': remote ref does not exist
既然remote端已经删掉,为什么用git branch -av还是能看到呢? 其实我们看到的,只是前面用git fetch 保存到本地的缓存信息而已。
ok,we can simple do:
git fetch --prune origin
or just:
git fetch --p origin
这时候,再执行git branch -av ,已经看不到remote的myBranch这个分支了
git合并时忽略某个文件
因为开发现场跟部署的环境不同,有很多ip
地址每次都要改来改去;于是开两个分支master
(用来保存部署现场的ip
)和dev
(开发环境的ip
),开发功能时在dev
分支,然后使用master
合并,每个分支都保存着自己的config
配置文件,不想dev
分支被master
合并时config
文件也合并.
- 创建自定义
merge driver
git config --global merge.ours.driver true
- 在要被
merge
的分支上创建.gitattributes
文件,并且在文件中置顶不merge
的文件名
echo 'config.js merge=ours' >> .gitattributes
git add .gitattributes
git commit -m 'chore: Preserve config.js during merges' //只是为了commit代码,可以
- 回到要合并到的分支
master
,执行merge
:
git merge dev
在dev
分支上的config.js
就不会被合并了;
但是这样merge时还是没有把config.xml给忽略,这是啥情况???
原来gitattribute
方法生效是有条件的,跟文件的修改顺序有关系,只有先修改的往后来修改的合并的时候才会生效。这里的先后是指文件的最后修改时间,不是创建的时间,如果最近修改过,那它就是最新的,比如刚才的例子,我们修改了publish
分支的info.plist
,而没有对另外两个分支下的info.plist
进行修改,那么publish
分支下的info.plist
就比另外两个分支新,这时候合并的时候,gitattribute
就会失去作用,那么该如做呢,我们在修改完publish
分支后,需要再次修改另外两个分支下的plist
配置文件,即使没啥可以改的,也要改(可以先改错,再改回去)这样我们publish
分支下的,就会仍然保持最旧。
举例:
release和debug都有个配置项文件:config
如果合并时你要忽略config,那你要先改debug分支的config,然后再改release分支的config,
这样你在release分支下进行:git merge debug时就会忽略config文件。
先后顺序很重要!!
汇总
git init git add Readme.md git add Readme1.md git add Readme2.md git commit -m "编写了多个Readme文件,一次性commit提交" # 掌握仓库当前的状态 git status # 查看当前文件与已提交版本库中文件的区别 git diff Readme.md # 查看显示从最近到最远的提交日志 git log [--pretty=oneline] # 版本回退, 上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ , 当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100 git reset --hard HEAD^ # 版本切换,直接使用commit id进行切换 git reset --hard commitId # 找不到commit id 怎么办?Git提供了一个命令git reflog用来记录你的每一次命令: git reflog # 命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况: # 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; # 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 # 总之,就是让这个文件回到最近一次git commit或git add时的状态。 # git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。 git checkout -- readme.txt # 可以把暂存区的修改撤销掉(unstage),重新放回工作区: git reset HEAD <file> # git checkout -- readme.txt git branch git branch dev git branch -d dev # 切换分支 git checkout dev # git switch dev # 创建分支 git checkout -b dev # git switch -c dev git checkout master git merge dev # 查看已有的本地及远程分支 git branch -a # 删除远程分支 git push origin --delete dev # 强制删除本地分支 git branch -D dev # 如果远程分支上面没有,但是本地缓存还有,需要重新fetch下 git fetch --prune origin git fetch --p origin # git branch --set-upstream 本地关联远程分支 # git branch --set-upstream-to=origin/remote_branch your_branch # 其中,origin/remote_branch是你本地分支对应的远程分支;your_branch是你当前的本地分支。 git branch --set-upstream-to=origin/jxb jxb git remote -v | --verbose 列出详细信息,在每一个名字后面列出其远程url,此时, -v 选项(译注:此为 –verbose 的简写,取首字母),显示对应的克隆地址。 # 强行覆盖方式:比如要使用BB分支的user.c和user.h来覆盖当前分支的对应文件,使用如下命令即可: git checkout BB user.c user.h 举例: git checkout dev Http\Repositories\Eloquent\User\UserExtra.php # 可以拉取其他分支合并到当前分支 # 当前分支是dev,拉取jxb的分支代码进行合并 git pull origin jxb # 当在dev分支进行开发很多未提交的文件,需要切换回jxb进行提交 # 1.先把工作区开发很多未提交的文件暂存 git stash # 2.切换回jxb git switch jxb # 3. 将暂存区的所有未提交的文件弹出,就可以在jxb分支进行提交了 git stash pop # git重命名远程分支 先删除远程分支 git push --delete origin dev 重命名本地分支 git branch -m dev develop 重新提交一个远程分支 git push origin develop 重新关联本地/远程 git branch --set-upstream-to=origin/develop develop #git将某个分支的代码完全覆盖另一个分支 假设每个人有个开发分支,想隔一段时间就把自己的开发分支上的代码保持和测试分支一直,则需要如下操作: 1.我想将test分支上的代码完全覆盖dev分支,首先切换到dev分支 git checkout dev 2.然后直接设置代码给远程的test分支上的代码 git reset --hard origin/test 3.执行上面的命令后dev分支上的代码就完全被test分支上的代码覆盖了,注意只是本地分支,这时候还需要将本地分支强行推到远程分支。 git push -f # git合并时忽略某个文件