我是靠谱客的博主 甜美老师,最近开发中收集的这篇文章主要介绍git常见问题及解决方案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文参考git-V2.19.1版本

一、.gitignore中文件未被忽略

原因

  • 语法错误

可以对照如下语法规则进行检查修复:

# 此为注释 – 将被 Git 忽略
*.a
# 忽略所有 .a 结尾的文件
!lib.a
# 但 lib.a 除外
/TODO
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/
# 忽略 build/ 目录下的所有文件
doc/*.txt # 忽略 doc/notes.txt 但不包括 doc/server/arch.txt
**/foo
# 忽略所有文件或文件夹foo
abc/**
# 忽略abc路径下所有文件
a/**/b
# 忽略a路径下的b,无论嵌套几层,比如a/b, a/x/b, a/x/y/b等
复制代码
  • 本地文件缓存

git的索引档案(index): .git/index文件中,当我们在工作区中进行了任意的操作之后git都会向这个文件中输入操作信息,当我们利用git status查询的时候,就会用index来和版本库中的最新版本进行比较,以此确定哪些文件是什么状态。(index是通过文件的内容来检索的。)

原因如下:

A gitignore file specifies intentionally untracked files that Git should ignore.
Files already tracked by Git are not affected; see the NOTES below for details.
To stop tracking a file that is currently tracked, use git rm --cached.
复制代码

进一步说明:git有四种状态(Untracked/Unmodified/Modified/Staged),从任意一种状态到Untracked都要执行从git版本库中删除但是本地文件未删除的操作。

git ls-files命令可查看版本库中的内容。

参考如下方法修复:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'
复制代码

参考资料

二、push失败

报错如下:

error: src refspec xx does not match any.

error: failed to push some refs to 'xxxx.git'

解决方案:

git push origin HEAD:xx
复制代码

三、常用命令说明

将远程分支拉到本地

git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
<start-point>
The new branch head will point to this commit. It may be given as a branch name, a commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.
eg: git checkout -b dev origin/dev
如果还需要将此分支推到远程分支
git push origin <branch_name>
如果远程分支没有该分支,则会新建。
复制代码

推送分支

将本地A分支推送到远程B分支

git push origin A:B
复制代码
git push origin :experimental
这个命令会删除分支。
Find a ref that matches experimental in the origin repository (e.g. refs/heads/experimental), and delete it.
复制代码
git checkout A
git push origin A
复制代码

将本地A分支推送到远程B分支

git checkout A
git push origin A:B
复制代码

删除分支

删除本地分支:git branch -d <branch_name>
强制删除本地分支: git branch -D <branch_name>
删除远程分支:git push origin -d <branch_name>
复制代码

合并分支

希望将A分支合并到B分支
git checkout B (切换至B分支)
git merge A (将A分支合并到B分支)
复制代码

解决冲突

合并的时候可能会出现冲突 打开Unmerged状态的文件

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
======= 将冲突分成两部分
上半部分从<<<<<<< HEAD:index.html 当前分支的内容开始
下半部分到>>>>>>> iss53:index.html结束
复制代码

手动解决冲突,然后提交即可。

参考资料

发送merge request

获取分支

git pull 相当于 git fetch 然后git merge
复制代码

更新远程跟踪分支

git fetch origin

上述命令从远程refs/heads/命名空间复制所有分支,并将它们存储到本地的refs/remotes/ origin/命名空间中,除非使用分支.<name>.fetch选项来指定非默认的refspec。
要特别注意的一点是当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本(拷贝)。 换一句话说,这种情况下,不会有一个新的xx分支 - 只有一个不可以修改的 origin/xx指针。
复制代码

git fetch origin dev

将dev分支拉取到本地

储藏与清理

git stash 等价于git stash push
--keep-index 选项告诉git不要储藏通过git add 命令已暂存的东西。不加此参数,会将已git add 后的一起储藏。
--include-untracked或-u标记,git也会储藏任何创建的未跟踪文件。默认情况下,git stash只会储藏已经在索引中的文件。
--patch Git 不会储藏所有修改过的任何东西,但是会交互式地提示哪些改动想要储藏、哪些改动需要保存在工作目录中。
git stash branch <branch_name>创建一个新分支,检出储藏工作时所在的提交,
复制代码
  • 切换分支时,需要提交当(commit)之前的工作,所以储藏修改。将新的储藏推送到栈上,运行git stash或git stash save。

  • git stash save --keep-index选项告诉git不要储藏通过git add 命令已暂存的东西。不加此参数,会将已git add 后的一起储藏。

  • git stash apply将刚刚储藏的工作重新应用。如果想应用其中一个更旧的储藏,可以通过名字指定,git stash apply stash@{2}。git stash apply --index表示

  • git stash pop应用并从栈上移除,相当于git stash apply 然后git stash drop stash@{latest}。

  • git stash clear 清除所有的stash。git stash drop stash@{1} 移除指定的储藏。

  • git stash list查看储藏的东西。

  • git stash push和git stash save的区别:'stash save' differs from "stash push" in that it cannot take pathspecs, and any non-option arguments form the message.

git stash push 后面可以跟路径,指定储藏路径,git stash save 后面无法跟路径,加上无效。另外,git stash push 后面可以加-m --message的缩写,git stash save 后面不可以加-m。

  • git stash pop 和 git stash apply的区别。

四、术语解释及区分

Git 的 “master” 分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改动它。

remote/origin/HEAD/refs分别代表什么

origin

当从远程仓库克隆了项目,clone命令会自动将其命名为origin,拉取它的所有数据,创建一个指向它的master分支的指针,并在本地将其命名为origin/master,git也会给你一个与origin的master分支指向同一个地方的本地master分支,这样你就有了工作基础。

“origin” 并无特殊含义 远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master。

HEAD

Git 又是怎么知道当前在哪一个分支上呢? 也很简单,它有一个名为 HEAD 的特殊指针。 请注意它和许多其它版本控制系统(如 Subversion 或 CVS)里的 HEAD 概念完全不同。 在 Git 中,它是一个指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。

origin master和 origin/master的区别

git push origin serverfix

git会将serverfix分支名字展开为refs/heads/serverfix:refs/heads/serverfix意味着“推送本地的serverfix分支来更新远程仓库上的serverfix分支”

git difftool --tool-help git difftool --tool=

git difftool可视化比较当前工作目录和暂存快照之间的差异。 (v2.2.0以后可用)

最后

以上就是甜美老师为你收集整理的git常见问题及解决方案的全部内容,希望文章能够帮你解决git常见问题及解决方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部