这里记录我平时使用git中遇到的问题及解决方式
目录
1 保存用户名及密码
2 不保存用户名密码
3 拉取远程新增分支
4 push 时省略远程库及分支名
5 查看本地所有分支
6 如何同时使用多个git仓库
7 分支管理问题-分支切换文件拉不下来
8 不小心 add 了文件
9 pull 时机问题
10 新建本地项目与远程库关联问题
11 windows文件名大小写忽略
12 git merge 及冲突解决
13 更新本地远程分支
14 git pull 冲突
git config --global credential.helper store
git config --global credential.helper cache
关闭当前 git 操作环境,重新打开,就需要用户名密码了
git fetch origin
:会将远程库新增的分支拉取到本地
拉取之后,只是获取到远程分支的信息,并没有在本地创建与之关联的分支,即修改代码之后提交不到该远程分支
需要先在本地创建一个与之关联的分支,然后再提交到该远程分支
命令: git checkout -b master20180912 remotes/http/master20180912
说明:
http
方式连接信息,通过 git remote -v
查看删除本地分支:git branch -d [分支名]
git push --set-upstream origin master
git branch -a
即 git 仓库嵌套
clone
子库在父库里面,对应的 remote -v
是父库的远程库地址;
进入子库目录,对应的 remote -v
是子库的远程库地址;
time: 2018.9.18
描述(场景):
本地库存在2个分支,每个分支里面嵌入的是一个git库,对应另一个远程库,即第6点嵌入的仓库。
分支管理中,修改bug时,需要同时在分支和 master 上提交这个功能,不能采用 merge 方式;
问题:在本地开发环境中提交代码到git库上,在分支上 pull 代码之后,提交分支代码;然后 checkout 到 master 主分支上,发现 master 上的代码已经被改变了,然后 pull 代码下来,总是提示已经是最新的部分了,但是文件又不是和git库上的一致,然后 git status
之后发现又有改动的地方。
发现:观察 git status 变化的部分,发现它是将之前分支拉下来的代码给 delete 掉了,然后换成了当前 master 分支原本的代码。
解答:其实文件在分支的时候就已经全部拉下来了,保存在本地分支库中,然后切换分支的时候,又把它删除了,回到目标分支原有的状态,但是这个嵌入的库受到父库的影响,必须要保持跟原本水平一致。所以切换分支的时候,父库是没有变化的,但是进入分支的子库,却发现已经变化了。
切换后的目标分支子库之所以文件变化,因为受到父库的影响,必须变化,所以子库的文件发生了变化。
总结:嵌入的库,如果父库存在多个分支,那么这个库受到父库的所有分支的影响,父库的分支策略不变,该嵌入的库在一次更新的时候,是把代码更新下来了的。之前认为父库的每个分支对应一个嵌入的子库,现在才发现其实父库的每个分支也只对应这同一个子库。
解决办法:这是属于不同分支对应同一个嵌套库的问题。1. 进入子库,将子库数据删完,重新拉取;2. 进入子库,执行 git checkout .
将变化的部分全部取消掉,恢复子库状态就行。
time: 20189.11.30
通常不小心使用 git add .
将所有文件添加到了暂存库,怎么撤销呢?
使用 git reset HEAD
让暂存库回滚到上次 commit 状态
本地库 -> 回滚(不保存内容) : git reset –hard
本地库 -> 暂存区(保存内容,撤销 commit,不撤销 add) : git reset --soft 暂存区 -> 工作区(保存内容,撤销 commit, 撤销 add) : git reset HEAD 工作区 -> 放弃修改:git checkout --
time: 2018.12.1
在多人合作的时候,容易出现代码冲突,所以在每次修改完需要 push 的时候,都会先 pull 一次代码。
pull 是在 add 之前,还是在 commit 之后呢?
当然是 add 之前,此时修改的代码还存在于临时修改区中,pull下来的代码直接会合并到本地库中,如果此时有冲突的,还能废气本地临时修改。
如果在 commit 之后,此时修改的代码已经合并到本地库了,然后 pull 下来的代码会和本地库起冲突,但是还是会拉下来,但是存在冲突的文件怎么办?如果使用 git reset HEAD
回滚到上次 commit 的位置,拉下来的代码又存在于临时修改区了。本次解决是直接删掉库,因为自己修改的不多,重新拉取再修改则可。
git 回滚命令还是不熟,需要对 git 整个生命周期节点熟悉后才能更好解决问题。
time: 2018.12.12
问题描述:在新建远程库、新建本地库之后,需要将2个库关联起来,在本地采用如下命令
git init
git add .
git commit -m "init project"
git remote add origin https://xxx.xxx.xx.git
git push origin master
这样子会报错,提示 Couldn't find remote ref master
问题解答:报这个错,是因为远程库也是新的,并没有内容。该采用这个命令 git push -u origin master
,目的是将本地的 master 分支推到远程 origin ,并指定 origin 为默认地址
time: 2019.3.4
在 windows 平台会忽略文件名大小写,而 linux 则不会。
问题描述:将已经存在的文件名 existFile.md
改成 ExistFile.md
,在 windows 平台提交代码的时候,使用 git status
命令是查看不到文件的变化的
问题解答:使用 git config core.ignorecase false
开启 windows 对文件名大小写敏感问题,然后就可以查看到对应变化,提交代码
后续问题:提交代码之后,会发现在 gitlab 上同时存在 ExistFile.md
和 existFile.md
,此刻如果直接去删除文件,别人 git pull
代码之后,会发现那几个文件消失了,因为别人也用的 windows 平台,没有开启大小写敏感。
临时解决方案:让 ExistFile.md
和 existFile.md
同时存在
time: 2019.3.29
以前没有怎么解决过分支版本合并冲突,今天遇到了合并冲突问题,这里记录一下
问题描述:
存在 dev 和 feature 2个分支,feature 是自己的开发分支,dev 是发布测试分支,大家都会往 dev 分支上发代码。
现在自己要将 feature 的代码合并到 dev 上面,但是产生了冲突,别人也已经修改了相同的文件。
我最先是在线合并,但是合并后,会将2者合并的结果同步到2个 dev 和 feature 分支上,出现了问题
原则:
git 回滚
正确的合并步骤
在 git merge xxx ,合并别人分支的时候,不能使用 git log 立马查看到别人的提交过程,需要提交合并后的结果之后才能看到别人的提交 log
管理别人分支:上面总结的是将自己的分支合并到主分支去,现在是要将别人分支合并到我的分支上来
git remote update origin --prune
当使用 git pull
时,如果多人同时修改一个文件,那么就会造成 conflict ,也就是冲突,导致 pull 不下来代码,那么如何解决这个问题呢?
早起我是将冲突的文件 copy 出来,记住自己修改的部分,然后 git checkout [file]
将自己修改的文件还原,然后再 pull 代码,最后将自己的代码添加进去
后面考虑到这个不是一个很好的解决办法,如果自己不知道自己改了哪些代码呢?就需要一个更好的方案
使用如下操作:
git stash
将自己本次修改添加到 stash 区,然后当前分支会回滚到上次 commit 的位置git pull
拉取代码git stash pop
将自己的修改从 stash 区检出