Git 问题及总结

1. pull时出现合并冲突

You have not concluded your merge (MERGE_HEAD exists).
Please, commit your changes before you can merge.

错误的原因是以前pull下来的代码不能自动合并而导致的,必须先撤销合并在pull。

1) 撤销合并

git merge –abort [Since git version 1.7.4]

git reset –merge [prior git versions]

2) 解决冲突.

3) add and commit the merge.

4) git pull now should work fine.

2. pull文件时和本地文件冲突

在没有保存本地文件修改下执行pull命令时,git会提示使用stash或者commit命令,也就是有两种解决方案。第一就是先add然后commit,最后执行pull,有冲突就解决。另一种就是使用stash命令。

1) 先将本地修改存储起来

$git stash

使用用git stash list可以看到保存的信息

2) 执行pull命令

3) 还原暂存的内容

$git stash pop stash@{0}

系统提示如下类似的信息:

Auto-merging c/environ.c
CONFLICT (content): Merge conflict in c/environ.c

意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。

4) 解决文件中冲突的的部分

打开文件解决冲突。解决完成之后,就可以正常的提交了。

3. push被拒绝

[rejected] master -> master (fetch first)

原因是没有同步远程的master,所以我们需要先同步一下

1) 首先pull一下

2) 如果有冲突就解决冲突并提交,最后push即可。

3) 如果没有冲突那么直接进行push即可。

4. push过程中错误

error: RPC failed; result=22, HTTP code = 411搜索
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly

原因是:默认 Git 设置 http post 的缓存为 1MB,使用命令将git的缓存设为500M:

git config http.postBuffer 524288000

再尝试push操作,问题解决,部署成功!

打开项目中隐藏的.git文件夹,找到config配置文件,在后天添加如下配置:

[http]  
    postBuffer = 524288000 

5. 从detached HEAD状态解救出来

在处于游离状态的时候,使用 git status命令查看的时候,将不会看到任何的创建的本地分支

1) 创建一个临时分支

$git branch temp commit_id

//commit_id的值可以查看终端的命令  根据不同情况执行不同的查询语句

2) 切换回工作分支,并合并刚刚新建的分支

$git checkout dev

$git merge temp 

$git push

3) 最后删掉之前创建的分支

$git branch -d temp

6. 撤销文件修改

  • git checkout – file;撤销对工作区修改;这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工作区对应文件file;这个命令改变的是工作区。

  • git reset HEAD – file;清空add命令向暂存区提交的关于file文件的修改(Ustage);这个命令仅改变暂存区,并不改变工作区。

  • git reset –mixed;此为默认方式,不带任何参数的git reset,就是这种方式,它回退到某个版本,只保留源码,回退commit和stage信息。

  • git reset –soft;回退到某个版本, 只回退了commit的信息,不会恢复stage(如果还要提交,直接commit即可)。

  • git reset –hard;彻底回退到某个版本, 本地的源码也会变为上一个版本的内容。

7. 使用.gitattributes

开发时我们将代码从开发分支合并到测试分支,有时并不希望把配置文件同时被和并进来,我们可以使用.gitattributes文件在合并时忽略某些文件,使用.gitattributes来告诉git对项目特定的文件使用不同的merge strategies,一个.gitattributes文件如下:

src/com/bcx/push/PushUtils.java merge=ours
src/com/nd/push/PushUtils.java merge=ours
src/com/dkw/push/PushUtils.java merge=ours
src/com/pet/push/PushUtils.java merge=ours

要想使.gitattributes有效,使用前应做如下设置:

git config --global merge.ours.driver true

8. reset与revert区别

• git reset是直接删除指定的commit,把HEAD向后移动了一下

• git revert是一次新的特殊的commit,HEAD继续前进,本质和普通add commit一样,仅仅是commit内容很特殊:提交的内容是与前面普通commit文本变化的反操作。

由于reset方式HEAD指针后移,推送到远端时需要有强制更新权限或者删除分支权限。

8. 关于历史记录

1) 修改历史提交记录

git commit –amend

该命令与下面的语句等价

//将branch的头指针向前移动一个commit,--soft选项使得index和workspace tree的内容保持移动之前不变
git reset --soft HEAD^  

//-c选项使得新提交的log message重用ORIG_HEAD指向的commit使用的log message,但允许用户编辑
git commit -c ORIG_HEAD  

ORIG_HEAD,用于指向前一个操作状态,每次的commit或者pull或者reset,git 都会把老的HEAD拷贝到.git/ORIG_HEAD,通过对ORIG_HEAD的引用可 以指向前一次的操作状态

2) Git reset –soft HEAD~5这个命令,把这5条commit当做一次提交。这对于重塑历史非常有用。

3) 修改提交树

  • 使用rebase

Rebase命令可以把已存在的提交,放到重新开始的一个分支上。Git rebase master 将当前所在分支的提交放到master分支上。Rebase命令能够让你优化仓库历史的清晰度。

git rebase –i HEAD~3
//3代表最后三次提交

执行该命令会在终端出现一个交互页面(vim的编辑窗口),我们将第2,3行pick改为squash,这个意义为将最后三次的提交压缩到倒数第三次的提交。

然后我们保存退出,git会一个一个压缩提交历史,如果有冲突,需要修改,修改的时候要注意,保留最新的历史,不然我们的修改就丢弃了。

//保存修改
git add .
//继续下一次rebase
git rebase --continue

直到三次压缩完成后,提交到远程仓库。

  • 使用cherry-pick

git cherry-pick C2 C4

执行上面的命令,Git 就将被C2 C4两次提交抓过来放到当前分支下了。

Git 问题及总结_第1张图片 Git 问题及总结_第2张图片

你可能感兴趣的:(git)