git使用教程及冲突解决

582 阅读8分钟

修改 .gitignore之后不生效,git push因为大文件而上传失败 解决方案

image.png

  • git 有超过 100MB 的文件,commit 之后,出现了报错,提示了,文件有超过 100MB

image.png

  • 原因:如果此时,手动删除超过100MB的文件,再次 commit,也无用。需要使用以下方式
解决办法:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch node_modules.rar'

执行完毕之后,再次 git push

image.png

冲突解决方案

git stash
git pull
git stash pop
  1. git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
  2. git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
  3. git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
  4. git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

fatal: Authentication解决办法

  1. git config --system --unset credential.helper
  2. 控制面板-用户账户-管理你的凭据-Windows凭据-普通凭据

解决 git pull/push 每次都要输入用户名密码的问题

首先明确一点:出现这种问题的原因都是因为使用http的方式拉取代码才出现的,如下图所示:

第一种解决方法(windows)

出现上面这种情况 先按提示输入用户名和密码,接着执行 git config --global credential.helper store 这句命令的意义是在本地生成包含 git 账号和密码的文件,具体操作如下图:

检验方式:C:\Users\你的电脑名; 这个文件夹(如下)下面是否能找到.git-credentials文件,如果文件的内容是有关你的gitlab的设置,格式为:http://{用户名}:{密码}@{git 网址}

再次执行 git pull 操作就不需要再输入用户名和密码了

第二种解决方法(通用)

切换 git 的拉取方式,将 http 改为 ssh 的方式

  1. 查看clone 地址:git remote -v
  2. 移除 http 的方式:git remote rm origin 移除完之后再次查看拉取方式会发现为空,此时我们需要添加 ssh 的拉取方式
  3. 换成 ssh方式: git remote add origin [git 地址] 此时通过 git remote -v 查看会发现成功的从 http 拉取方式切换为 ssh 拉取方式了 大功告成!

本条内容转载至简书【浅滩上的小螃蟹 】

简单的代码提交流程

  1. git status 查看工作区代码相对于暂存区的差别
  2. git add . 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录
  3. git commit -m ‘注释’ 将缓存区内容添加到本地仓库
  4. git push origin master 将本地版本库推送到远程服务器, origin是远程主机,master表示是远程服务器上的master分支,分支名是可以修改的

git fetch 和 git pull 的区别

  1. fetch:相当于是从远程获取最新版本到本地,不会自动merge
git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master  ..origin/master //比较本地的master分支和origin/master分支的差别
git merge origin/master //进行合并

这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

如果你使用git clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库(git remote -v)并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull命令来自动的抓取然后合并远程分支到当前分支。 这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。 2. git pull:相当于是从远程获取最新版本并merge到本地

git pull origin master    //相当于git fetch 和 git merge
注:用git pull更新代码的话就比较简单暴力了但是根据commit ID来看的话,他们实际的实现原理是不一样的,所以不要用git pull,用git fetch和git merge更加安全。

Git add

git add [参数] <路径> 作用就是将我们需要提交的代码从工作区添加到暂存区,就是告诉git系统,我们要提交哪些文件,之后就可以使用git commit命令进行提交了。
为了方便下面都用 . 来标识路径, . 表示当前目录,路径可以修改,下列操作的作用范围都在版本库之内。

  1. git add .
    不加参数默认为将修改操作的文件和未跟踪新添加的文件添加到git系统的暂存区,注意不包括删除
  2. git add -u .
    -u 表示将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增加的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库之后这个文件就会从git系统中消失了。
  3. git add -A .
    -A 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区。

Git commit

git commit 主要是将暂存区里的改动给提交到本地的版本库。每次使用git commit命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id,commit-id 在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里.

  1. git commit -m ‘message’
    -m 参数表示可以直接输入后面的“message”,如果不加-m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message, message即是我们用来简要说明这次提交的语句。
  2. git commit -am ‘message’ -am等同于-a -m
    -a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区
    注意: 新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。

Git push

在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构。
git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名。第一个master是本地分支名,第二个master是远程分支名。

  1. git push origin master
    如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
  2. git push origin :refs/for/master
    如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin –delete master
  3. git push origin
    如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
  4. git push
    如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
  5. git push -f origin master
    那我就强制上传覆盖远程文件(这个命令在团队开发的时候最好不要用,否则可能会有生命危险)