CC BY 4.0 (除特别声明或转载文章外)
git是什么鬼,这个就不啰嗦了,是个程序猿都知道。这篇文章主要是记录常用的git操作以及常见错误的解决方案,人老了,脑子记不住,遇到一些错误解决之后过几天就忘了,所以秉着好记性不如烂笔头的伟大信念,我决定有必要系统性整理一下,方便日后查找。
分为四个部分:
- 1、git学习资料;
- 2、git命令与常用操作;
- 3、git的设置;
- 4、错误解决方法;
第一部分 - git学习资料以及选项解释
这里是我收集的git学习资料:
另外,关于一些比较疑惑的git命令选项,我也收集了一部分,不是很全,目前就遇到了工作中不懂的一些命令选项。
1-1: git 仓库内部结构
1-2: origin到底是什么意思?
可以参考知乎的此问题,origin,译为起源,我个人理解为远程仓库在本地的一个别名或者标签,这个是约定俗成的,也可以改为其他名字。同时,要区分repository(仓库)和 master(主分支)这两个概率的区别,举个栗子:repository是一棵树的树根,master则是这个树的主干,其他枝叶都是从master分出去的。不论是主干还是枝干,它们通通都起源于树根。
这样就很容易理解命令:git push origin master
。
1-3: git -u这个参数到底表示什么?
-u 参数即 –set-upstream, 依然参考知乎的此问题,用来关联本地分支和远程分支。举一个非常简单的例子:
我在本地新建了一个分支test,并提交到远程仓库,然后取回远程仓库的更新。
git checkout -b test
git push origin test
git pull #此时就会报错,因为git不知道去拉取远程的哪个分支
但是,如果使用了git push -u origin test
,等价于:
git push origin test;
git branch --set-upstream test origin/test
第二部分 - git命令与常用操作
2-1:git命令
- git status #查看仓库状态
- git add xxx.txt #添加文件到仓库
- git log #查询历史记录,加参数
--pretty=oneline
简化显示信息 - git checkout – file #撤销工作区的修改,即撤销未add的修改
- git reset HEAD file #撤销暂存区的修改,即撤销add后的修改,之后再使用
git checkout -- file
- git branch #查看本地分支
- git branch -a #查看所有分支,包括本地和远程分支
- git push origin –delete test #删除远程仓库的test分支
- git push origin –delete tag
#删除远程仓库的标签 - git remote -v #显示远程仓库,-v表示显示仓库的url地址
2-2:常用操作
- 版本回退与恢复,使用git reset
git reset --hard HEAD^ #回退到上一个版本,HEAD表示当前版本 git reflog #仓库的所有操作记录
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本写成 HEAD~100
- 提交所有有改动的文件:
git add . git add --update . git commit -am "提交描述"
第三部分 - git的设置
主要是一些常用的git设置,一般都是使用git config
命令。
3-1:git config 常用配置
- 设置用户名和邮箱
git config --global user.name "Your Name" git config --global user.email "email@example.com"
--global
,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
3-2:git push免用户名、密码输入
如果使用https向远程push代码时,总是要输入用户名和密码,长期如此会觉得很烦,网上搜索有三种解决方案。具体参考:
- Git - gitcredentials Documentation
- Git - git credential store
- Caching your GitHub password in Git
- Git Push 避免用户名和密码方法
方法一:切换成ssh模式
Domi@DomiCat MINGW64 /d/Github/domi-vimrc (master)
$ git remote -v
origin https://github.com/shuimu98/domi-vimrc.git (fetch) #这里表示使用的是https方式
origin https://github.com/shuimu98/domi-vimrc.git (push)
$ git remote rm origin
$ git remote add origin git@github.com:shuimu98/domi-vimrc.git
$ git push origin
#如果push失败,报以下错误
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
按照提示输入
$ git push -u origin master
或
$ git push --set-upstream origin master
方法二:设置 credential helper,打开git bash,按顺序输入以下命令:
cd ~
touch .git-credentials
vim .git-credentials #输入 https://{username}:{password}@github.com
git config --global credential.helper store
用 cat .gitconfig
查看配置文件,会看到:
[credential]
helper = store
方法三: 使用环境变量存储用户名和密码(未自测)
- 在 windows 中添加一个 HOME 环境变量,变量名: HOME, 变量值:
%USERPROFILE%
; - 进入
%HOME%
目录,新建一个名为_netrc
的文件,文件中内容格式如下:machine {git account name}.github.com #如果无效,改为 machine github.com login your-usernmae password your-password
第四部分 - 出现的错误以及解决方法
4-1:warning: push.default is unset
原因:git1.x版本与2.x版本对push的行为不同而产生的该警告。具体参考:这里
解决方法:
打开git bash,设置git全局配置: git config --global push.default matching
或者 git config --global push.default simple
- matching, Git 1.x 的默认行为,其意是如果你执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支。
- simple,Git 2.x 的默认行为,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码。
4-2:warning: LF will be replaced by CRLF
CRLF( Carriage-Return Line-Feed,回车换行),ACSII字符为 \r\n
。
原因: Git的换行符检查功能。因为操作系统定义的换行符的不一致,windows系统使用 CRLF(\r\n)来表示一行结束,而linux用 \n 来表示换行,Git提供了一个换行符检查功能(core.safecrlf),可以在提交时检查文件是否混用了不同风格的换行符。Git可以在你提交时自动地把行结束符CRLF转换成LF,而在迁出代码时把LF转换成CRLF。具体参考:这里
解决方法: 可以忽略