git 操作手册

git是什么鬼,这个就不啰嗦了,是个程序猿都知道。这篇文章主要是记录常用的git操作以及常见错误的解决方案,人老了,脑子记不住,遇到一些错误解决之后过几天就忘了,所以秉着好记性不如烂笔头的伟大信念,我决定有必要系统性整理一下,方便日后查找。

分为四个部分:

  • 1、git学习资料;
  • 2、git命令与常用操作;
  • 3、git的设置;
  • 4、错误解决方法;

第一部分 - git学习资料以及选项解释

这里是我收集的git学习资料:

另外,关于一些比较疑惑的git命令选项,我也收集了一部分,不是很全,目前就遇到了工作中不懂的一些命令选项。

1-1: git 仓库内部结构

pic

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 常用配置

  1. 设置用户名和邮箱
    git config --global user.name "Your Name"  
    git config --global user.email "email@example.com"  
    

--global,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

3-2:git push免用户名、密码输入

如果使用https向远程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

方法三: 使用环境变量存储用户名和密码(未自测)

  1. 在 windows 中添加一个 HOME 环境变量,变量名: HOME, 变量值:%USERPROFILE%
  2. 进入 %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。具体参考:这里

解决方法: 可以忽略