本地操作

状态检览

1
2
$ git status -s
XY PATH1 -> PATH2

PATH2只有在PATH1关联到不同的路径时才会显示(例如, 文件重命名).

XY是两个状态码, 在合并冲突的时候, X和Y分别表示合并双方的修改状态; 而在一般情况下X表示暂存区域(index)的状态, Y表示工作目录的状态(work tree):

  • ’ ’ = unmodified
  • M = modified
  • A = added
  • D = deleted
  • R = renamed
  • C = copied
  • U = updated but unmerged

未被追踪(untracked)的文件, XY = ??; 默认不显示忽略的文件(ignored), 除非使用--ignore选项, 此时XY = !!.

查看已暂存和未暂存的修改

1
$ git diff

用来比较工作目录中当前文件和暂存区域快照之间的差异, 使用--staged选项查看已经暂存的将要添加到下次修改的内容

提交更新

1
$ git commit

这种方式会启动shell的环境变量$EDDITOR所指定的软件, 一般是VIM或emacs, 或者使用git config --global core.editor来指定编辑器, 使用-v选项将diff的内容追加到编辑器中, 使用-m '${comment}'选项来直接添加提交信息, 而不打开编辑器.

跳过使用暂存区

1
$ git commit -a

git会自动把所有已经跟踪过的文件暂存起来一并提交, 跳过git add步骤.

移除文件

1
$ git rm ${fileName}

移除工作目录文件, 并记录移除操作, 如果删除之前修改过并且已经放到暂存区域的话, 必须使用强制删除选项-f, 用于防止误删.

1
$ git rm --cached ${fileName}

从git仓库(亦从暂存区移除)移除文件, 而保留磁盘文件

移动文件

1
$ git mv ${oldFileName} ${newFileName}

等价于

1
2
3
$ mv ${oldFileName} ${newFileName}
$ git rm ${oldFileName}
$ git add ${newFileName}

查看提交历史

1
$ git log

默认情况下, git会按提交时间列出所有的更新, 最近的更新排在最上面. 使用-p选项来显示每次提交的内容差异; -${n}选项来明确要显示几次提交, n为自然数; --stat选项输出每次提交的简略统计信息; --pretty来指定使用不同的默认格式的方式展示提交历史, 格式有oneline, short, fullfuller, 或者用--pretty=format:"${format}"来指定显示格式; --graph选项使用ASCII字符形象地展示分支, 合并历史.

撤销操作

1
$ git commit --amend

用来尝试重新提交, 修改提交信息.

1
$ git reset HEAD ${fileName}

撤销文件暂存.

1
$ git checkout -- ${fileName}

撤销对文件的修改(丢失修改信息).

远程仓库使用

查看远程仓库

1
$ git remote

使用-v选项来显示对应的url.

如果想要查看一个远程仓库的更多信息, 使用git remote show ${remoteName}

从远程仓库中抓取与拉取

1
$ git fetch ${remoteName}

访问远程仓库, 从中拉取所有你还没有的数据, 而不会自动合并或修改当前的工作, 需要手动合并.

使用clone会自动将其添加为远程仓库并默认为’origin'.

如果一个分支设置为跟踪一个远程分支, 可以使用git pull来自动抓取然后合并远程分支到当前分支; 默认情况git clone会自动的设置本地master 分支跟踪clone的远程仓库的master分支

远程仓库的移除与重命名

1
2
git remote rename ${oldName} ${newName}
git remote rm ${remoteName}

分支管理

分支的新建与合并

1
$ git checkout -b ${branchName}

创建新分支并切换当前分支至新分支, 等价于:

1
2
$ git branch ${branchName}
$ git checkout ${branchName}
1
git merge ${branchName}

合并到当前分支, 使用rebase来确保在向远程分支推送时提交历史的整洁, 即rebasemerge在提交历史上的存在差异.

分支管理

1
git branch

显示所有分支, -v选项来查看每一个分支的最后一次提交信息; --merged--no-merged来查看已经合并或尚未合并到当前分支的的分支; -d选项来 删除已经完全合并了的分支, -D选项强制删除分支.

配置

1
git config credential.helper store

保存使用HTTP协议的密码

换行符

由于文本文件使用的换行符在不同的操作系统下不一致的问题(在Unix/Linux上为0x0A(LF), 而在DOS/Windows上为0x0D0A(CRLF)), 当换行符发生改变时, Git会认为整个文件被修改而导致无法diff, 此时一种解决方案是设置全局的autocrlf配置项:

1
git config --global core.autocrlf true

其中配置项的值可以是:

  1. true: 提交时转为LF, 检出时转为CRLF
  2. false: 提交检出均不转换
  3. input: 提交时转为LF, 检出时不转换

另外还有safecrlf配置项, 其值为:

  1. true: 拒绝包含混合换行符文件的提交
  2. false: 允许包含混合换行符文件提交
  3. warn: 提交包含混合换行符文件时给出警告

另外一种方案则是对每个仓库单独建一个.gitattributes文件来单独配置:

# from https://help.github.com/articles/dealing-with-line-endings/
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

其中几条规则:

  1. text=auto: Git自动处理这些文件, 通常建议的默认选项
  2. text eol=crlf: Git将在检出这些文件时自动转成CRLF, 建议将一些必须CRLF的文件设为该配置(如.bat), 另外还有eol=lf
  3. binary: Git会认为这些文件不应该改变, 等同于text -diff