Git的环境变量
Git的环境变量可以在三个地方设置:
- /etc/gitconfig文件:对所有用户适用,使用git config命令时指定‘–system’选项。
- ~/.gitconfig文件:只适用于当前用户,使用git config命令时指定‘–global’选项。
- 当前项目目录中的.git/config文件:仅对当前项目有效,不用指定任何选项。
每个级别的配置都会覆盖上层的相同配置,.git/config里的配置会覆盖/etc/gitconfig中的同名变量。
用户信息
配置个人的用户名称和电子邮件。Git在每次提交时都会引用这两条信息,说明是谁提交了,这两条配置会随更新内容一起被纳入历史记录。
$ git config [--global] user.name <user_name>
$ git config [--global] user.email <user_email>
查看配置信息
查看已有的配置信息
$ git config --list
查看某个环境变量的设置,直接指定该环境变量的名称就可以:
$ git config user.name
获取帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
常用命令
本地操作
克隆现有仓库
$ git clone <url>
查看当前文件的状态
$ git status
跟踪新文件/暂存已修改的文件
$ git add <file>
查看未暂存的改动
$ git diff
查看已暂存的改动
$ git diff --cached
删除文件
$ git rm <file_path>
移动/重命名文件
Git的元数据并不跟踪移动/重命名操作,但它能推断出是移动/重命名操作。
$ git mv <file_from> <file_to>
或者
$ mv <file_from> <file_to>
$ git rm <file_from>
$ git add <file_to>
提交更新(已暂存的改动)
$ git commit -m '<commit_log>'
提交已经跟踪过的文件的更新(跳过git add步骤,一步就暂存并提交)
$ git commit -a -m '<commit_log>'
查看提交历史
$ git log
使用-p选项可以显示每次提交的内容差异。
另外还有--pretty选项,可以指定不同于默认格式的方式展示提交历史。
在--pretty选项指定为oneline或format的时候,结合--graph选项可以看到开头会多出一些ASCII字符串表示的简单图形,展示每个提交所在的分支及其分化衍合情况。
还可以指定--since和--until设置时间范围,用--author选项指定作者(只显示该作者的提交)
如果只关心某些文件或目录的历史提交,可以在git log选项的最后指定路径(path)
撤销commit
$ git reset --hard <commit_id>
取消已经暂存的文件
$ git reset HEAD <file>
取消对文件的修改
$ git checkout -- <file>
打标签
// 给HEAD加标签
$ git tag -a <tag_name> -m '<message>'
// 后期对早先的某次提交加标签
$ git tag -a <tag_name> <commit_checksum>
查看标签
// 列出已有的tag
$ git tag
// 显示指定tag的版本信息和提交对象
$ git show <tag_name>
分享标签
$ git push origin <tag_name>
// 一次推送所有本地新增的标签
$ git push origin --tags
分支操作
新建并切换分支
$ git branch <branch_name>
$ git checkout <branch_name>
或者
$ git checkout -b <branch_name>
在切换分支之前,需要保持一个清洁的工作区域(暂存区和工作目录),那些还没有提交的修改会和即将检出的分支产生冲突从而阻止Git为你切换分支。但现实工作中,工作区域不可能一直保持清洁,解决办法见后面的“冲突处理”。
推送本地新建分支到远程仓库
$ git push --set-upstream <remote_name> <branch_name>
推送数据到远程仓库
$ git push <remote_name> <branch_name>
把本地分支推送到某个命名不同的远程分支
$ git push <remote_name> <branch_name>:<remote_branch_name>
合并分支
$ git checkout <target_branch_name>
$ git merge <source_branch_name>
冲突处理
- 如果在合并时或git pull时发生冲突,可以用git status查阅哪些文件出现了冲突。
- 接着手工定位并解决这些冲突(Git会在有冲突的文件里加入标准的冲突解决标记)。 也可以运行git mergetool,调用一个可视化的合并工具来引导你解决所有冲突。
- 解决了所有文件里的所有冲突后,运行git add将把它们标记为已解决状态(暂存就表示冲突已经解决)。
- 再运行一次git status,确认所有冲突都已解决。
- 用git commit完成合并提交。
删除分支
$ git branch -d <branch_name>
列出当前所有的分支,并显示当前所在的分支
$ git branch
查看各个分支最后一个提交对象的信息
$ git branch -v
查看哪些分支已被并入当前分支(一般来说,列表中没有*的分支通常都可以用git branch -d删掉)
$ git branch --merged
查看尚未合并的分支
$ git branch --no-merged
对于尚未合并的分支,删除的时候(git branch -d
储藏
当你正在进行某一部分工作,里面的东西比较杂乱,这时候需要转到其他分支上进行一些工作,但又不能提交进行了一半的工作。这种情况怎么办?
$ git stash
“储藏”可以获取工作目录的中间状态(也就是修改过的被追踪的文件和暂存的变更),并将它保存到一个未完结变更的堆栈中,以便以后重新应用。
查看现有的储藏
$ git stash list
重新应用储藏
$ git stash apply <stash_name>
# 不指定stash_name的话,会重新应用最新的储藏
# 这个命令只能重新应用文件的变更,没有重新暂存已被暂存的文件
重新应用被暂存的变更
$ git stash apply --index
从堆栈中移除储藏
stash apply只尝试应用储藏的工作,储藏的内容仍然在栈上。
$ git stash drop <stash_name>
重新应用储藏并从堆栈中移除储藏
$ git stash pop
忽略某些文件
有些文件不需要纳入Git的管理,比如日志或临时文件等自动生成的内容。大家应该不希望这些文件在每次git status的时候都出现在未跟踪文件列表里,也不希望它们被纳入配置管理。可以创建一个名为.gitignore的文件,列出要忽略的文件模式。
.gitignore的格式规范如下:
- 空行或者以注释符号#开头的行会被Git忽略。
- 可以使用标准的glob模式匹配。 glob模式是指Shell使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符;问号(?)匹配一个任意字符;如果在方括号中使用短横线分隔两个字符,表示这两个字符范围内的都可以匹配。
- 匹配模式最后跟斜杠(/)说明忽略的是目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
举例来说:
$ cat .gitignore
# 注释,被Git忽略
# 忽略所有.log结尾的文件
*.log
# 但oom.log除外
!oom.log
# 忽略项目根目录下的test文件,不包括api/test
/test
# 忽略target目录下的所有文件
target/
# 忽略doc目录下的doc文件,但不包括doc/manual/*.doc
doc/*.doc
# 忽略doc目录中的所有txt文件
doc/**/*.txt
初始化新仓库
对现有的某个项目开始用Git管理,只需到此项目所在的目录执行:
$ git init