zl程序教程

您现在的位置是:首页 >  工具

当前栏目

git的一些疑问

Git 一些 疑问
2023-09-27 14:21:47 时间

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文件也合并.

  1. 创建自定义merge driver
git config --global merge.ours.driver true
  1. 在要被merge的分支上创建.gitattributes文件,并且在文件中置顶不merge的文件名
echo 'config.js merge=ours' >> .gitattributes
git add .gitattributes
git commit -m 'chore: Preserve config.js during merges'  //只是为了commit代码,可以
  1. 回到要合并到的分支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合并时忽略某个文件