git 笔记

有关Git使用的笔记

(1) Git是什么

Git是目前世界上最先进的分布式版本控制系统(没有之一)

(1.1) 配置Git

安装完git建议配置的选项

配置用户名 git config --global user.name "wkq"
配置邮箱 git config --global user.email "weikeqin.cn@gmail.com"
不忽略大小写 (文件名区分大小写) git config --global core.ignorecase false
不适用路径转义 (可以认为类似使用UTF-8) git config --global core.quotepath false

(1.2) 生成ssh

ssh-keygen -t rsa -C "weikeqin.cn@gmail.com"

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/schacon/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/schacon/.ssh/id_rsa.
Your public key has been saved in /Users/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
43:c5:5b:5f:b1:f1:50:43:ax:20:a6:92:6a:1x:9x:3x schacon@agadorlaptop.local

输入以上命令,然后一直回车,最后就可以生成ssh了
把生成的ssh公钥配置到git服务器上,比如github git.oschina 以后提交代码的时候可以用ssh协议,速度快,还不用输密码

(1.3) 牛刀小试

使用git把项目上传到git服务器

  1. git init 初始化一个仓库

  2. git add * 把所有文件标记问添加状态

  3. git commit -m "2017-05-21 21:14 init " 提交

  4. git add remote origin master git@github.com:wkq278276130/weikeqin.github.io.git 添加远程仓库(地址改成自己的)

  5. git fetch origin 把远程仓库的修改拉到本地 (如果远程仓库没有文件,这一步可以可以省略)

  6. git push origin --all 推送所有分支

  7. git push origin --tags 推送所有标签

(1.2) 牛刀小试2

git clone git@git.oschina.net:wkq278276130/git_test.git  # 从远程仓库克隆到本地
vim readme.txt  # 新建或修改readme.txt
git add readme.txt  # 把readme文件添加到暂存区
git commit -m "修改readme文件"  # 把修改提交,把修改保存到本地仓库
git push origin master  # 把修改推送到远程仓库

(1.3) 迁移仓库

其实很简单,把仓库克隆下来,并传到另一个远程仓库
比如从github的远程仓库克隆到本地,然后传到/推送到gitee远程仓库

  1. git clone --bare git://github.com/username/project.git 从原地址克隆一份裸版本库
    –bare 创建的克隆版本库都不包含工作区,直接就是版本库的内容,这样的版本库称为裸版本库。

  2. git push --mirror git@gitee.com/username/newproject.git 以镜像推送的方式上传代码到 gitee 服务器上。

(1.4) 工作区和暂存区

工作区和暂存区
如图,我们修改后的文件都保存在工作区
把Git当成一个软件,它需要我们告诉它保存哪些东西
git add操作就是告诉Git要保存哪些修改,使用git add命令后保存的修改就放到暂存区了
(注意:是保存的修改放到暂存区,没有保存的修改还在工作区)
git commit操作是告诉Git把保存的修改提交,git commit后就保存的修改就提交到到本地仓库了

(2) 常用命令

(2.1) 生成Git仓库

git init 进入一个目录下,使用git init 命令,会把这个目录变成Git可以管理的仓库

(2.2) 添加修改

git add filename 把文件标记为添加状态
git add readme.txt

(2.3) 保存修改

git commit -m "message" 提交到本地仓库,并包含提交时更新的信息。
git commit -m "2016-05-03 07:40 add lib and jars"

(2.3.1) 修改最后依次提交的注释

git commit --amend
注意,Git默认使用UTF-8编码,在windows cmd命令行可能乱码,推荐使用Git Bash

(2.3.2) 提交部分修改

git cherry-pick <commit id> 把已经提交的commit,从6.0分支放到1.0分支
  先切换到一个分支,然后 git cherry-pick

(2.4)  添加远程仓库

git remote add origin(仓库别名,默认是origin,可以自己设置) 地址

git remote add origin https://git.oschina.net/wkq278276130/java_test_all.git 使用的https协议

git remote add origin git@git.oschina.net:wkq278276130/java_test_all.git 使用ssh协议

(2.5) 更新代码

git pull origin master

(2.5.1) pull和fetch的区别

git fetch 从远程获取最新版本到本地

` git fetch origin master `  拉取远程仓库master分支的更新

git merge origin/master 把远程master分支的更新合并到本地master分支

git pull = git fetch + git merge

以上命令的含义:
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并

(2.6) 提交修改

git push origin master 把本地仓库推送到远程仓库(实际上是把master分支推送到远程)
远程仓库git默认叫origin

git push origin master --force 强制推送(有危险)

git push -f -u origin master

第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命。
git push -u origin master 第一次推送要加 -u

(2.7) 查看仓库当前状态

git status

(2.8) 查看不同

git diff 查看文件修改前和修改后的不同

git diff readme.txt

git diff --cached #查看已经暂存区文件

git diff --staged #查看和上次提交时快照之间的差异

git diff commit_id1 commit_id2 #查看两个快照之间的差异

git diff branch1 branch2 --stat #查看两个分支所有差异的文件列表

git diff branch1 branch2 文件名(路径,推荐使用绝对路径) #查看同一文件在不同分支上的差异

git diff branch1 branch2 #查看所有有差异文件的详细信息

git log -p filename #查看文件的每一个详细的历史修改,如果没有-p选项,只显示提交记录,不显示文件内容修改。

git log -p -3 filename 显示最近的3次提交。

git log --pretty=oneline filename #每一行显示一个提交,先显示哈希码,再显示提交说明

git blame filename #查看文件的每一行是哪个提交最后修改的

(2.9) 暂存修改

git stash 把修改的内容先保存起来

git stash save "保存2017-04-12 用户板块的修改" 暂存修改并加备注 save 可以加备注

git stash list 查看工作区

git stash pop 把保存的内容,同时把stash删除

git stash apply stash@{1} 将你指定版本号为stash@{1}的工作取出来

git stash pop --index stash@{0} 恢复编号为0的进度的工作区和暂存区

git stash --help for more info

(2.10) git log

git log 显示从最近到最远的提交日志

git log --stat 显示提交历史,并简要显示受影响的文件和行数

git log -p -2 详细显示最近两次提交的内容

git log -n 1 -p 查看最近一次提交的详细内容

git reflog 记录你的每一次修改的日志

(2.11) 撤销修改 版本回退

(2.11.1) 还没有提交,撤销修改

git checkout readme.txt 把工作区的readme.txt文件的修改全部撤销

git reset HEAD readme.txt 取消已经暂存的文件

(2.11.2) 已经提交,撤销修改(回退/回滚)

本地版本回退
git reset HEAD <file> 取消暂存文件,把暂存区的修改撤销
git reset -- readme.txt

` git reset --hard commit_id `  回退到某一个版本

  ` git reset --hard 6db2eef ` 回退到指定版本

git reset -- hard HEAD~i
6db2eefcad16a8b9e85a1e995f697fd76ef76559 这是我的git中的一个日志id
HEAD~ 后面的 ~ 是键盘上1前面的,不是6那个,不要弄错了
` git reset – hard HEAD
1 git reset –hard HEAD^ 回退到上一个版本 git reset –hard HEAD^^ ` 回退到上上一个版本

` git reset --hard 91e7b75 `

把本地的版本回退(本次回退相当于一次新的提交),再用git push把本地的修改提交

git revert commit_id 备注:用于回退一次提交,不能用于回退多次提交,不能用于merge的回退

  A -> B -> C -> D 
  如果想把B,C,D都给revert,除了一个一个revert之外,还可以使用range revert
  git revert -n B^..D 
  这样就把B,C,D都给revert了,变成: A-> B ->C -> D -> D'-> C' -> B'

git revert -n old_commit^..new_commit 用于回退连续多次提交,不能用于merge的回退

git revert -n 8c49615^..bdbb007

git revert -m 1 xxxx 用于merge的回退

(2.11.2.1) git reset和git revert的区别

reset是回朔到指定的commit版本(指定commit版本之后的操作都消失了)。
revert是删除指定的commit操作的内容(指定的版本内容消失,之前和之后commit版本内的操作都保留),但是这个操作也会做了一个commit提交版本。

举个例子,lisi提交了3次,分别是1,2,3 现在项目经理想回退到2,
假如用git reset就相当于直接回退到2,仓库还剩两次提交1,2 (打游戏打到第三关,回退到第二关)
用git revert也回退到2的内容了,只不过产生了一个新的提交4,git revert完成后仓库有4个提交1,2,3,4 (打游戏打到第三关,想玩第二关了,再开一关和第二关一模一样)

推荐使用git revert,假如用git reset,如果zhangsan的本地仓库有3这次commit,lisi把本地仓库回退到2,并且强制推送到远程仓库,假如zhangsan不知道,直接用push,就会又把3提交到远程仓库
如果使用git revert就不用担心这种事情。

(2.12) 克隆仓库

从远程仓库克隆到本地
git clone 仓库地址

git clone git@github.com:wkq278276130/weikeqin.github.io.git

(2.13) 补丁

(2.13.1) diff 补丁

打补丁

在commit以后, 使用git diff xxx > xxx_path生成补丁

git diff master > 2017-04-27_测试补丁_patch

git diff 9609398 > 2017-04-27_测试补丁2_patch (9609398是commit_id)

应用补丁

别人给你一个补丁,你怎么使用
如果你收到了一个使用 git diff 或 Unix diff 命令(不推荐使用这种方式,具体见下一节)创建的补丁,
可以使用 git apply 命令来应用。 假设你将补丁保存在了 /tmp/patch-ruby-client.patch 中,可以这样应用补丁:
git apply C:/WorkSpaces/git/java_test_all/2017-04-27_测试补丁_patch

在实际应用补丁前,你还可以使用 git apply 来检查补丁是否可以顺利应用——即对补丁运行 git apply –check 命令:

$ git apply --check 0001-seeing-if-this-helps-the-gem.patch
error: patch failed: ticgit.gemspec:1
error: ticgit.gemspec: patch does not apply

(2.13.2) format-patch补丁

使用 am 命令应用补丁

$ git am 0001-limit-log-function.patch
Applying: add limit to log function

你会看到补丁被顺利地应用,并且为你自动创建了一个新的提交。 其中的作者信息来自于
电子邮件头部的 From 和 Date 字段,提交消息则取自 Subject 和邮件正文中补丁之前的内容。

(2.14) git clean

git clean 是删除没有track过的文件(就是没有被add过的文件)
相当于批量git checkout的操作

git clean -n 是一次clean的演习, 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒

git clean -f 删除当前目录下所有没有track过的文件. 他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过

git clean -f <path> 删除指定路径下的没有被track过的文件

git clean -df 删除当前目录下没有被track过的文件和文件夹

git clean -xf 删除当前目录下所有没有track过的文件. 不管他是否是.gitignore文件里面指定的文件夹和文件

(3) 分支管理

git branch 查看当前分支

git branch -a 查看分支(包括远程的分支,远程分支会用红色表示出来)

git branch dev 创建分支

git branch branch-name tag-name 根据tag创建分支

git checkout -b branch-name tag-name 根据tag创建并切换分支

git checkout dev 切换分支

git checkout -b dev 表示创建并切换,相当于以上两条命令

git merge dev 把dev分支的工作成果合并到当前分支上

git merge  用于合并指定分支到当前分支

git merge –no-ff -m “2016-10-09 18:26:00 不使用快速合并,修改XX内容” dev

git merge dev --squash 多次commit合并成一个

git branch -d <name> 删除分支
git branch -D <name> 强制删除分支

git push [远程仓库别名] [本地分支]:[远程分支]
如果省略 [本地分支],那就等于删除远程分支

git push origin :branch-name 删除远程分支
git push origin --delete branch-name 删除远程分支

git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致

git fetch origin 远程分支名:本地分支名

git branch -m old-branch-name new-branch-name 分支重命名

git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联

git log --graph 查看分支合并图

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
git merge --no-ff -m "merge with no-ff" dev 准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward

(4) 标签管理

git tag v1.0 新建一个标签

git tag 查看所有标签

git tag name commit-id 对某次提交打标签
git tag v0.9 6224937

git tag -d tagName 删除标签
git tag -d v0.1 删除0.1版本的标签

git push origin tagName 推送某个标签到远程

git push origin --tags 一次性推送全部尚未推送到远程的本地标签

标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除,然后,从远程删除。删除命令也是push
git tag -d v0.9
git push origin :refs/tags/v0.9

(5) .gitignore文件配置

.gitignore 配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为我们的版本管理带来很大的便利。

以下是配置 .gitignore 的一些配置。

1、配置语法:
斜杠/表示目录
星号*通配多个字符
问号?通配单个字符
方括号[]包含单个字符的匹配列表;
叹号!表示不忽略(跟踪)匹配到的文件或目录;
此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效。

2、示例:
(1) logs/* 说明:忽略目录logs下的全部内容,注意,不管是根目录下的 /logs/ 目录,还是某个子目录 /child/logs/ 目录,都会被忽略。
(2) /logs/* 说明:忽略根目录下的 /logs/ 目录的全部内容
(3) /* !.gitignore !/fw/bin/ !/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的/fw/bin/ 和 /fw/sf/目录

.gitignore文件配置

# git
.git

# java
*.class
*.jar
*lib*

# log
*.log
/log
/logs

# idea
.idea
*.iml
*.iws
*.ipr
/out
/bin

# eclipse
.project
.classpath
.settings
.apt_generated
.factorypath
/target


# mac
.DS_Store

#svn
.svn
*svn*

# other
*.swp
*.txt

(6) 常见问题

使用git命令时推荐使用Git Bash,这样会有很多好处,不用担心乱码

(6.1) 在命令行无法使用git

因为你的环境变量没配置,系统识别不了git命令,所以会报错,
在环境变量path里添加git软件的bin路径就可以了(类似于JDK)
我的git安装在F:\Program Files\Git,所以我在path里添加F:\Program Files\Git\bin就可以在命令行使用了

(6.2) 中文不能正确地显示

在默认设置下,中文文件名在工作区状态输出,查看历史更改概要,以及在补丁文件中,文件名的中文不能正确地显示,而是显示为八进制的字符编码,示例如下:

$ git status -s
?? "\350\257\264\346\230\216.txt\n
$ printf "\350\257\264\346\230\216.txt\n"
说明.txt
通过将Git配置变量 core.quotepath 设置为false,就可以解决中文文件名称在这些Git命令输出中的显示问题,示例:
$ git config --global core.quotepath false  (在命令行输入这个配置)
$ git status -s
?? 说明.txt

(6.3) 命令行提示 Your console font probably doesn’t support Unicode.

Your console font probably doesn’t support Unicode.
If you experience strange characters in the output, consider switching to a TrueType font such as Consolas!

  1. 修改命令行的字体,使用新宋体。
  2. 设置git的参数,按照如下设置
git config --global core.quotepath false  # 全局(一个电脑上)设定
git config  core.quotepath false  # 只在某一个项目里设定

(6.4) git命令行每次都要输入用户名密码,能不能只输入一次永久使用

7.14 Git 工具 - 凭证存储

#保存输入的密码 “store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期。
git config --global credential.helper store

#保存输入的密码 “cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除。
git config --global credential.helper cache


(6.6) git保存密码后,修改密码后报错-清除本地保存的密码

修改密码后,本地拉代码可能会报错

../info/refs not valid: is this a git repository?
  fatal: could not read Username for 'https://git.xxx.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see xx for additional information.

修改密码后清除本地密码

git config --local --unset credential.helper        #清除当前仓库设置的存储凭证
git config --global --unset credential.helper       #清除全局设置的存储凭证
sudo git config --system --unset credential.helper  #清除系统上设置的存储凭证

mac用户还需要看一下 git config --list 里是否有 credential.helper=osxkeychain
如果有,需要通过 git config --show-origin --get credential.helper 命令查看osxkeychain在哪个文件存储,并且删除掉。

[weikeqin@weikeqin ~]$
[weikeqin@weikeqin ~]$ git config --show-origin --get credential.helper
file:/Library/Developer/CommandLineTools/usr/share/git-core/gitconfig	osxkeychain
[weikeqin@weikeqin ~]$
[weikeqin@weikeqin ~]$ sudo vi /Library/Developer/CommandLineTools/usr/share/git-core/gitconfig
[weikeqin@weikeqin ~]$

7.14 Git 工具 - 凭证存储
Mac 上清除 git osxkeychain 保存的登录名密码


(6.6) 设置别名

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" 

git config --global alias.lg2 "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %C(blue)(%cr) %Cgreen<%an>%Creset  %C(bold blue)(%ci)' --abbrev-commit --date-order"

git config --global alias.lge "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %C(blue)(%cr) %Cgreen<%an>%Creset  %C(bold blue)(%ci) %Cred(%ae)' --abbrev-commit --date-order"
%h:  缩写提交哈希    abbreviated commit hash
%d:  ref名称    ref names, like the --decorate option of git-log(1)
%s:  提交的注释  subject    
%cr: 相对于现在提交多长时间    committer date, relative
%an: 作者姓名    author name
%cn: 提交者姓名    committer name
%ci: 提交者日期,类似ISO 8601的格式    committer date, ISO 8601-like format    2018-01-10 21:58:02 +0800
%ae: 作者邮箱    author email
%ce: 提交电子邮件    committer email

(6.7) 改写历史,永久删除git库的物理文件

WEB-INF/lib 留存有很多jar文件,使用maven管理项目后不需要这些jar文件了,想在git里删除
通过 git help filter-branch 找到改变历史的办法,具体操作如下:
记得在git bash里执行,cmd了没法执行。

git filter-branch --tree-filter 'rm -f src/test/java/com/xxxx/xxxx/crawler/test/company/tianyuancha/TianYanChaTest.java' --tag-name-filter cat -- --all
Rewrite 85c3264950f054e351a1b03a9ebaa039e3a991f6 (82/82) (118 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
Ref 'refs/stash' was rewritten


#一定要强推
git push origin --all --force
git push origin --tags --force

如果不强推,会出现如下错误

git push origin master
To ssh://code.xxx.com.cn/xxx/xxx.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'ssh://git@code.xxx.com.cn/xxx/xxx.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.



git fetch origin master
From ssh://code.xxx.com.cn/xxx/xxx
 * branch            master     -> FETCH_HEAD
 + 7fd80b5...11bb05e master     -> origin/master  (forced update)



git push origin master --force
Counting objects: 1708, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1199/1199), done.
Writing objects: 100% (1708/1708), 751.75 KiB | 0 bytes/s, done.
Total 1708 (delta 588), reused 0 (delta 0)
remote: 处理 delta 中: 100% (588/588), 完成 32 个本地对象.
To ssh://code.xxxx.com.cn/xxx/xxx.git
 + 11bb05e...0c364e9 master -> master (forced update)
git clone git@github.com:jfinal/jfinal.git
git filter-branch --tree-filter 'rm -f WebRoot/WEB-INF/lib/*.jar' --tag-name-filter cat -- --all
git push origin --tags --force
git push origin --all --force

删完后再 git clone 整个文件大小缩减到 940K,git clone 秒秒钟搞定,即便是 github 也是极速,打完收工
http://my.oschina.net/jfinal/blog/215624

(6.8) 使用git log命令乱码

乱码

推荐使用Git Bash,使用cmd可能会出现乱码,因为windows中文版的cmd默认使用GBK编码

λ git lg2
* 64784dd - (HEAD -> master, oschina/master) 2017-09-07 <E5><90><88><E5><B9><B6><E4><B8><A4><E4><B8><AA><E5><88><86><E6><94><AF><E7><9A><84><E4><BF><A1><E6><81><AF> (2 minutes ago) <WeiKeQin>  (2017-09-07 11:52:14 +0800)
*   33a456e - Merge branch 'master' of git.oschina.net:wkq278276130/test (4 minutes ago) <WeiKeQin>  (2017-09-07 11:50:22 +0800)
|\
| * d05b779 - 2017-08-29 init (9 days ago) <usdptext>  (2017-08-29 10:58:46 +0800)
* 4cf57ca - 2017-09-07 <E5><90><88><E5><B9><B6><E4><B8><A4><E4><B8><AA><E4><BB><93><E5><BA><93><E7><9A><84><E9><85><8D><E7><BD><AE> (4 minutes ago) <WeiKeQin>  (2017-09-07 11:50:00 +0800)
* 5df1a38 - 2017-09-07 <E6><B7><BB><E5><8A><A0><E8><B4><A2><E7><BB><8F><E7><BD><91><E7><AB><99> (13 minutes ago) <WeiKeQin>  (2017-09-07 11:41:44 +0800)
* e0ad97e - 2017-08-30 init  for backup (8 days ago) <WeiKeQin>  (2017-08-30 16:24:26 +0800)
# 通过将Git配置变量 core.quotepath 设置为false,就可以解决中文文件名称在这些Git命令输出中的显示问题
 git config --global core.quotepath false

 如果设置后还有乱码,使用git config --list查看配置
 撤销不必要的配置
  git config  --global --unset  i18n.commitencoding
  git config  --global --unset i18n.logoutputencoding
  git config  --global --unset i18n.logoutputenconding

(6.9)  warning: user.name has multiple values

git config --global --replace-all user.name "WeiKeQin"

(6.10) 误删文件怎么办

原理和版本回退的原理一样

1. 刚误删,还没提交
  git reset head
  git checkout test.txt

2. 已经提交了
  2.1 提交到本地仓库,没有推送到远程仓库
    git reset
  2.2 提交到本地仓库,并且已经推送到远程仓库
    git revert

(6.11) 想提交其他分支的个别提交

git rebase -i <earlier SHA>

原理: -i 参数让 rebase 进入“交互模式”。它开始类似于前面讨论的 rebase,但在重新进行任何提交之前,
它会暂停下来并允许你详细地修改每个提交。

(6.12) 停止追踪一个文件

场景: 你偶然把 application.log 加到代码库里了,现在每次你运行应用,Git 都会报告在 application.log 里
有未提交的修改。你把 *.login 放到了 .gitignore 文件里,可文件还是在代码库里

问题:你怎么才能告诉 Git “撤销” 对这个文件的追踪呢?

方法: git rm –cached application.log

原理: 虽然 .gitignore 会阻止 Git 追踪文件的修改,甚至不关注文件是否存在,
但这只是针对那些以前从来没有追踪过的文件。一旦有个文件被加入并提交了,Git 就会持续关注该文件的改变。
类似地,如果你利用 git add -f 来强制或覆盖了 .gitignore, Git 还会持续追踪改变的情况。
之后你就不必用-f 来添加这个文件了。

如果你希望从 Git 的追踪对象中删除那个本应忽略的文件, git rm –cached 会从追踪对象中删除它,
但让文件在磁盘上保持原封不动。因为现在它已经被忽略了,你在 git status 里就不会再看见这个文件,
也不会再偶然提交该文件的修改了。

(6.13) Auto packing the repository in background for optimum performance.

Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
Counting objects: 383927, done.

运行git gc命令,会比较耗时

> git gc
Counting objects: 383930, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (383307/383307), done.
Writing objects: 100% (383930/383930), done.
Total 383930 (delta 12057), reused 3 (delta 0)
Removing duplicate objects: 100% (256/256), done.

(6.14) src refspec test-v1.3 matches more than one.

> git push origin test-v1.3
error: src refspec test-v1.3 matches more than one.
error: failed to push some refs to 'git@git.oschina.net:wkq278276130/test.git'

原因:
原因是 branch和tag的名字重复了,git不知道推送branch还是tag,所以会出错。
我本地有一个branch叫test-v1.3,有一个tag叫test-v1.3,推送的时候就报这个错。

解决办法:
删除tag
git tag -d test-v1.3
然后推送就可以了

建议tag命名的时候用成test-v1.3_tag
在分支名后加个_tag,这样能避免重复

(6.15) Connection reset

Connection reset by 120.55.226.24 port 22
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly

我连的WiFi变了,ip地址变了,导致这个问题

(6.16) remote: GitLab: You are not allowed to change existing tags on this project.

remote: GitLab: You are not allowed to change existing tags on this project.

https:#stackoverflow.com/questions/44019963/how-to-delete-remote-server-tag

(6.17) ssh_dispatch_run_fatal

ssh_dispatch_run_fatal: Connection to 192.30.255.112 port 22: message authentication code incorrect
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

重新克隆

(6.18) Git 合并时将其当作一个新的提交而不是记录你合并时的分支的历史记录

squashed merge

(6.19) Git没有共同祖先的两个分支如何合并

git merge your_branch --allow-unrelated-histories

(6.20) 统计每个开发者提交多少次

git shortlog --numbered --summary

(6.21) git 默认对文件名大小写不敏感 (不区分文件名大小写)

在更新博客的时候发现文件名重命名了后重新部署,本地没有问题,但是服务器上找不到,提示404,刚开始以为是next主题的问题,后来才发现是git的锅
是因为git默认文件名大小写不敏感,也就是不区分文件名大小写,导致我把博客的文件名改成小写后,url里还是大写的博客名,导致几十篇博客不能访问。

解决办法:
配置 git config --global core.ignorecase false

这样修改后,发现远程仓库还是大写的,有三个办法解决

  1. 文件少的话,用 git mv README.md readme.md 命令来删除缓存head
  2. 如果有文件夹,可以用 git rm --cached src/java/ -r 来删除缓存head
  3. 把涉及到的文件放另一个目录,然后提交一次,再把文件移回来,在提交一次。 ()
  4. 把git仓库删了,重新git init一下,然后重新提交

(6.30) fatal: refusing to merge unrelated histories

造成这个问题的原因是远程仓库里有内容,但是提交者不知道,自己新建了一个仓库,并且使用已有仓库的url,提交的时候强制推送到远程仓库,造成unrelated histories,下面是解决办法

git merge origin/master --allow-unrelated-histories

git 查看最近或某一次提交修改的文件列表相关命令整理。

git log --name-status 每次修改的文件列表, 显示状态(新增还是修改)

git log --name-only 每次修改的文件列表

git log --stat 每次修改的文件列表, 及文件修改的统计

git whatchanged 每次修改的文件列表

git whatchanged --stat 每次修改的文件列表, 及文件修改的统计


git show 显示最后一次的文件改变的具体内容
git show -5 显示最后 5 次的文件改变的具体内容
git show commitid 显示某个 commitid 改变的具体内容

git lg2

WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git lg2
*   e7ae2c2 - (HEAD -> master, origin/master, origin/HEAD) Merge pull request #25551 from Johnny-Wish/master (4 hours ago) <996icu>  (2019-04-14 18:27:14 +0800)
|\
| *   dff20c3 - Merge branch 'master' into master (4 hours ago) <996icu>  (2019-04-14 18:27:06 +0800)
| |\
| |/
|/|
* |   311757c - Merge pull request #25548 from liyujiang-gzu/master (4 hours ago) <996icu>  (2019-04-14 18:26:20 +0800)
|\ \
| * | 29684d8 - 有老铁(#25532)想要把华为移除黑名单,特此添加“华为杭州研发基地+华为外包”加班的打卡记录证据,华为正式员工和华为外包员工一起工作,作息是一样的: (6 hours
 ago) <gzu-liyujiang>  (2019-04-14 16:22:17 +0800)
* | |   cf24662 - Merge pull request #25547 from KyleStore/master (4 hours ago) <996icu>  (2019-04-14 18:26:05 +0800)
|\ \ \
| * | | 8339a63 - add Diary: a web app (7 hours ago) <KyleStore>  (2019-04-14 15:51:05 +0800)
| |/ /

git log –name-status

WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git log --name-status
commit e7ae2c2640d47591f420b2c9392933fb1e366327 (HEAD -> master, origin/master, origin/HEAD)
Merge: 311757c dff20c3
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:14 2019 +0800

    Merge pull request #25551 from Johnny-Wish/master

    增加工人日报报导 : 马云谈996时,可曾知道8小时工作制是这样争取来的!

commit dff20c318502f3cc42d3a7990a88fbd609b30940
Merge: 3418ba3 311757c
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:06 2019 +0800

    Merge branch 'master' into master

commit 311757c4b7057fa47a5857c1973ec8313d92b2f3
Merge: cf24662 29684d8
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:26:20 2019 +0800

    Merge pull request #25548 from liyujiang-gzu/master

    添加“华为杭州研发基地+华为外包”加班的打卡记录证据

1

WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git log --name-only
commit e7ae2c2640d47591f420b2c9392933fb1e366327 (HEAD -> master, origin/master, origin/HEAD)
Merge: 311757c dff20c3
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:14 2019 +0800

    Merge pull request #25551 from Johnny-Wish/master

    增加工人日报报导 : 马云谈996时,可曾知道8小时工作制是这样争取来的!

commit dff20c318502f3cc42d3a7990a88fbd609b30940
Merge: 3418ba3 311757c
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:06 2019 +0800

    Merge branch 'master' into master

commit 311757c4b7057fa47a5857c1973ec8313d92b2f3
Merge: cf24662 29684d8
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:26:20 2019 +0800

    Merge pull request #25548 from liyujiang-gzu/master

    添加“华为杭州研发基地+华为外包”加班的打卡记录证据
WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git log --stat
commit e7ae2c2640d47591f420b2c9392933fb1e366327 (HEAD -> master, origin/master, origin/HEAD)
Merge: 311757c dff20c3
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:14 2019 +0800

    Merge pull request #25551 from Johnny-Wish/master

    增加工人日报报导 : 马云谈996时,可曾知道8小时工作制是这样争取来的!

commit dff20c318502f3cc42d3a7990a88fbd609b30940
Merge: 3418ba3 311757c
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:06 2019 +0800

    Merge branch 'master' into master

commit 311757c4b7057fa47a5857c1973ec8313d92b2f3
Merge: cf24662 29684d8
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:26:20 2019 +0800

    Merge pull request #25548 from liyujiang-gzu/master

    添加“华为杭州研发基地+华为外包”加班的打卡记录证据
WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git whatchanged
commit 3418ba36ec2f5b66fa2256bdd1811d70e237ae6b
Author: Shuheng Johnny Liu <wish1104@outlook.com>
Date:   Sun Apr 14 18:00:14 2019 +0800

    add new report by 工人日报 : 马云谈996时,可曾知道8小时工作制是这样争取来的!

:100644 100644 9f74c1f a9d70b6 M        externals/news.md

commit 0abff86f5a2621967c39fcd2fc64dba9a4c98d41
Author: kwonghinho <jiangyanhao1991@gmail.com>
Date:   Sun Apr 14 17:03:38 2019 +0800

    添加《不能给反对996的员工贴“混日子”标签》

:100644 100644 9f74c1f d9f509a M        externals/news.md

commit 29684d8c8692ee5208af1dfbad861c52641913bc
Author: gzu-liyujiang <admin@qqtheme.cn>
Date:   Sun Apr 14 16:22:17 2019 +0800

    有老铁(#25532)想要把华为移除黑名单,特此添加“华为杭州研发基地+华为外包”加班的打卡记录证据,华为正式员工和华为外包员工一起工作,作息是一样的:

:100644 100644 a52d394 a53b6e5 M        blacklist/README.md
:000000 100644 0000000 2d8ff70 A        blacklist/img/huawei_hangzhou_timing.png
WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git whatchanged --stat
commit 3418ba36ec2f5b66fa2256bdd1811d70e237ae6b
Author: Shuheng Johnny Liu <wish1104@outlook.com>
Date:   Sun Apr 14 18:00:14 2019 +0800

    add new report by 工人日报 : 马云谈996时,可曾知道8小时工作制是这样争取来的!

 externals/news.md | 2 ++
 1 file changed, 2 insertions(+)

commit 0abff86f5a2621967c39fcd2fc64dba9a4c98d41
Author: kwonghinho <jiangyanhao1991@gmail.com>
Date:   Sun Apr 14 17:03:38 2019 +0800

    添加《不能给反对996的员工贴“混日子”标签》

 externals/news.md | 2 ++
 1 file changed, 2 insertions(+)

commit 29684d8c8692ee5208af1dfbad861c52641913bc
Author: gzu-liyujiang <admin@qqtheme.cn>
Date:   Sun Apr 14 16:22:17 2019 +0800

    有老铁(#25532)想要把华为移除黑名单,特此添加“华为杭州研发基地+华为外包”加班的打卡记录证据,华为正式员工和华为外包员工一起工作,作息是一样的:

 blacklist/README.md                      |   2 +-
 blacklist/img/huawei_hangzhou_timing.png | Bin 0 -> 65678 bytes
 2 files changed, 1 insertion(+), 1 deletion(-)
WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git show
commit e7ae2c2640d47591f420b2c9392933fb1e366327 (HEAD -> master, origin/master, origin/HEAD)
Merge: 311757c dff20c3
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:14 2019 +0800

    Merge pull request #25551 from Johnny-Wish/master

    增加工人日报报导 : 马云谈996时,可曾知道8小时工作制是这样争取来的!

WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git show -5
commit e7ae2c2640d47591f420b2c9392933fb1e366327 (HEAD -> master, origin/master, origin/HEAD)
Merge: 311757c dff20c3
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:14 2019 +0800

    Merge pull request #25551 from Johnny-Wish/master

    增加工人日报报导 : 马云谈996时,可曾知道8小时工作制是这样争取来的!


commit dff20c318502f3cc42d3a7990a88fbd609b30940
Merge: 3418ba3 311757c
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:06 2019 +0800

    Merge branch 'master' into master

diff --cc externals/news.md
index a9d70b6,147a7ce..8207483
--- a/externals/news.md
+++ b/externals/news.md
@@@ -12,6 -14,6 +14,8 @@@

  - 人民网:[“996工作制”是谁的如意算盘?](http://opinion.people.com.cn/n1/2019/0402/c119388-31009768.html)([Wayback Machine](https://web.archive.org/web/20190409022535
/http://opinion.people.com.cn/n1/2019/0402/c119388-31009768.html))

++- 工人日报:[马云谈996时,可曾知道8小时工作制是这样争取来的!](https://mp.weixin.qq.com/s/tp0u0wI0gHEjlV5ZpdDoDQ)
++
  - 工人日报:[“工作996,生病ICU”该引起重视了](http://news.workercn.cn/32845/201904/07/190407041525409.shtml)([Wayback Machine](https://web.archive.org/web/20190409022
551/http://news.workercn.cn/32845/201904/07/190407041525409.shtml))

  - 央广网:[风波再起 40余家互联网公司被指实行“996工作制”](http://china.cnr.cn/xwwgf/20190405/t20190405_524568985.shtml)([Wayback Machine](https://web.archive.org/web/
20190409022701/http://china.cnr.cn/xwwgf/20190405/t20190405_524568985.shtml))

commit 311757c4b7057fa47a5857c1973ec8313d92b2f3
Merge: cf24662 29684d8
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:26:20 2019 +0800

    Merge pull request #25548 from liyujiang-gzu/master

    添加“华为杭州研发基地+华为外包”加班的打卡记录证据
WKQ@WKQ-PC MINGW64 /d/WorkSpaces/data/996.ICU (master)
$ git show  dff20c3 e7ae2c2
commit dff20c318502f3cc42d3a7990a88fbd609b30940
Merge: 3418ba3 311757c
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:06 2019 +0800

    Merge branch 'master' into master

diff --cc externals/news.md
index a9d70b6,147a7ce..8207483
--- a/externals/news.md
+++ b/externals/news.md
@@@ -12,6 -14,6 +14,8 @@@

  - 人民网:[“996工作制”是谁的如意算盘?](http://opinion.people.com.cn/n1/2019/0402/c119388-31009768.html)([Wayback Machine](https://web.archive.org/web/20190409022535
/http://opinion.people.com.cn/n1/2019/0402/c119388-31009768.html))

++- 工人日报:[马云谈996时,可曾知道8小时工作制是这样争取来的!](https://mp.weixin.qq.com/s/tp0u0wI0gHEjlV5ZpdDoDQ)
++
  - 工人日报:[“工作996,生病ICU”该引起重视了](http://news.workercn.cn/32845/201904/07/190407041525409.shtml)([Wayback Machine](https://web.archive.org/web/20190409022
551/http://news.workercn.cn/32845/201904/07/190407041525409.shtml))

  - 央广网:[风波再起 40余家互联网公司被指实行“996工作制”](http://china.cnr.cn/xwwgf/20190405/t20190405_524568985.shtml)([Wayback Machine](https://web.archive.org/web/
20190409022701/http://china.cnr.cn/xwwgf/20190405/t20190405_524568985.shtml))

commit e7ae2c2640d47591f420b2c9392933fb1e366327 (HEAD -> master, origin/master, origin/HEAD)
Merge: 311757c dff20c3
Author: 996icu <48942249+996icu@users.noreply.github.com>
Date:   Sun Apr 14 18:27:14 2019 +0800

    Merge pull request #25551 from Johnny-Wish/master

    增加工人日报报导 : 马云谈996时,可曾知道8小时工作制是这样争取来的!

References

[1] git官网  
[2] git book 中文版
[3] git doc 英文版
[4] git-log
[5] 廖雪峰的git教程  
[6] git入门
[7] 将本地项目推送到Git
[8] git中文资料
[6] git rebase简介(基本篇)
[9] 在commit之前撤销git add操作
[10] Git fetch和git pull的区别
[11] Git的中文支持
[12] git 中文支持配置
[13] git中reset和revert用法和区别
[14] 代码回滚:git reset、git checkout和git revert区别和联系
[15] git book
[16] 如何在 Git 里撤销(几乎)任何操作
[17] git 远程分支版本回退
[18] Git Community Book 中文版 rebase  
[19] 「Git」合并多个 Commit  
[20] Svn和Git的一次详细对比