Git是比较优秀的分布式版本管理工具,这次学习了git的基本命令,现在作一些归纳总结,已备复习之用。
Git 认识
- Git 直接用hash值记录提交的修改文件的快照,本地操作无需联网
- Git 有三种状态,你的文件可能处于其中之一:
1.已修改(modified) —— 表示修改了文件,但还没保存到数据库中。
2.已暂存(staged) —— 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
3.已提交(committed)—— 表示数据已经安全的保存在本地数据库中。
- 基本的 Git 工作流程如下:
1.在工作目录中修改文件。 --工作目录
2.暂存文件,将文件的快照放入暂存区域。 --暂存区域
3.提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。 --Git仓库
Git 配置
- Git 自带
git config
的工具来设置控制 Git 外观和行为的配置变量,这些变量存在三个位置,相应参数会从相应的文件读写配置,每一级别覆盖上一级的配置,如.git目录的config覆盖上一级,具有最高优先级。
1./etc/gitconfig
文件, --system参数,如: git config --system xx
2.~/.gitconfig
或 ~/.config/git/config
文件,--global参数,
3.当前仓库.Git 目录中的 config
文件, 不加参数
- 配置用户信息,设置用户名称与邮件地址
- 配置默认文本编辑器,未配置会使用系统默认文本编辑器,通常是vim
$ git config --global user.name "test"
$ git config --global user.email test@example.com
$ git config --global core.editor emacs
$ git config --global core.editor "'C:/Program Files/Sublime Text/sublime_text.exe' -w" ## windows下配置编辑器sublime()
$ git config --list ## 检查配置信息
$ git config username ## 检查git某一项配置
- 有三种方法可以查找Git 命令的使用手册
git help <verb> ##如 git help config
git <verb> --help
man git-<verb>
Git 基础
- 获取Git仓库有两种方式:
- 对已有的工作目录管理,初始化仓库
cd test #进入要初始化的目录test
git init #初始化,test目录下生成.git文件夹
git add test.txt #跟踪test.txt文件,或者使用*通配符跟踪目录下所有文件
git commit -m 'test' #提交快照,说明
2. 在指定目录下克隆远程仓库
git clone https://github.com/github/test_git.git #在当前目录下初始化.git文件夹,并新建test_git文件夹,拷贝远程仓库内容在test_git文件夹下
git clone https://github.com/github/test_git.git mould #同上,不过本地仓库名称改为mould
- Git仓库初始化后,你的工作目录下的每个文件不外乎两种状态:
- 已跟踪 —— 是指那些已被纳入版本控制的文件,存在于上一次提交的快照的记录中,它们的状态可能处于未修改,已修改或者已放入暂存区。克隆某个仓库的工作目录下的文件都属于此类,并处于未修改状态;
- 未跟踪 —— 工作目录除了已跟踪以外的文件,它们不存在于上一次提交的快照记录中,也没被放入暂存区
- 检查当前文件状态 git status
xxxx ~/documents/git/test (master) ##括号里的master显示当前所处的分支
$ git status ## 检查目录下文件的状态
On branch master ## 所处分支 master
Initial commit
nothing to commit (create/copy files and use "git add" to track) ## 没有需要提交的,也没有未被跟踪的文件
新建文件test.txt后,再次检查状态
$ git status
On branch master
Initial commit
Untracked files: ## 未跟踪的文件--test.txt,Git不会主动添加跟踪
(use "git add <file>..." to include in what will be committed) ## 提示用git add 跟踪
test.txt
nothing added to commit but untracked files present (use "git add" to track)
跟踪新文件 git add test.txt 后,再次查看状态
$ git add test.txt
warning: LF will be replaced by CRLF in test.txt. ## 正常情况不会有之下的提示,
The file will have its original line endings in your working directory. ## 用vim新建的文件test.txt,linux和windows的换行符不同,具体可以搜下
$ git status
On branch master
Initial commit
Changes to be committed: ## 修改将被提交,已处于暂存状态
(use "git rm --cached <file>..." to unstage)
new file: test.txt ##test.txt已被跟踪
再次修改test.txt文件,git status查看状态之后
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: test.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: test.txt
test.txt同时出现在暂存区和非暂存区,现在提交的会提交上一次git add的那个版本的修改,而不是提交此时文件的内容,就验证了git暂存区的存在
- 状态简栏:git status -s或者git status --short
$ git status -s
M edit.txt # M-修改了没放入暂存区
A new.txt # A-修改了放入暂存区
MM test.txt # 左边M表示修改了已放入暂存区颜色为绿色,右边M表示修改了没放入暂存区颜色为红色,与上边的M相同
?? out.txt # ??表示没有被跟踪
- 配置忽略文件--.gitignore,告诉git仓库不需要跟踪的文件,在工作目录下新建.gitignore文件
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore
文件列表,你可以在 https://github.com/github/gitignore
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
- 查看已暂存和未暂存的修改 git diff
git diff ## 不加参数,比较的是工作目录中当前文件和暂存区域快照之间的差异,就是修改之后还没有暂存起来的变化内容
git diff --cached ## (git 1.61或更高版本允许使用git --staged) 查看已经暂存起来的变化
- 提交更新 git commit
git commit -m 'commit str' ## 加上提交信息,方便查看每次提交,提交后的信息有哪个分支,和SHA-1校验
git commit -a -m 'commit tracked' ## 加上 -a 参数,Git会自动把所有已跟踪过的文件暂存起来一并提交,没跟踪的文件不会被操作
- 移除文件 git rm
rm text.txt ## 简单的从工作目录删除文件,但没有移除跟踪记录,git status会提示 changes no staged for commit,
git rm text.txt ## 从跟踪文件清单中移除,并连带从工作目录删除
git rm -f text.txt ## 如果文件删除之前已被跟踪,并且修改了,则需要用强制删除 -f,这样是防止误删,不能恢复
git rm --cached log/\*.log ## 从git仓库中移除,亦从暂存区中移除,但还在工作目录,不跟踪,当把不需要跟踪的日志文件等add暂存区时,此方法很有用
- 重命名 git mv
git mv text.txt rename.txt ## 重命名操作
- 查看提交历史 git log 会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明
git log -p -2 ## -p显示每次提交的内容差异, -2 仅显示最近两次提交
git log --stat ## 显示每次提交的简略的统计信息
git log --pretty=oneline ## --pretty 使用其他格式显示历史提交信息,oneline,short,full,fuller 和 format(后跟指定格式)
git log --pretty=format:"%h %s" --graph ## --graph 显示 ASCII 图形表示的分支合并历史
git log --since=2.weeks ## 指定时间之前的提交
撤销操作
- 撤销操作 git commit --amend
git commit -m "bug" ## 提交完成后发现某个文件没添加,或提交信息写错
git add bug.txt ## 添加需要提交的文件
git commit --amend ## 参数--amend会重新提交,第二次提交覆盖第一次提交的结果,最终只有一次提交
- 取消暂存的文件 git reset HEAD [file]
git add * ## 暂存了所有文件
git reset HEAD test.txt ## 取消暂存的test.txt文件
注:调用时加上--hard选项可能会导致工作目录中所有当前进度丢失
- 撤销对文件的修改 git checkout -- [file]
注:这个命令会撤销你对此文件所有的修改,还原成上一次提交的样子,慎用,除非你真的想撤销,可以用Git 分支来处理,记住Git里提交的东西几乎都是可以恢复的
Git 远程仓库的使用
- 查看远程仓库 git remote
git remote ## 列出你指定的每一个远程服务器的简写,如果你克隆了自己的仓库,至少能看到origin,这是Git给你克隆的仓库默认的名字
git remote -v ## 选项-v,会显示远程仓库的简写与其对应的URL
- 添加远程仓库 git remote add <shortname> <url>
git remote add mygit https://github.com/xxx/xxx.git ##为远程仓库添加简写mygit
- 从远程仓库中抓取与拉取
git fetch [remote-name] ## 会从最初克隆的服务器上拉取到本地仓库,并不会自动合并或修改你当前的工作
git pull [remotej-name] ## 会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支
- 推送到远程仓库 git push [remote-name] [branch-name]
git push origin master ## 会将master分支推送到origin服务器(clone时自动设置好的两个名字)
- 查看远程仓库 git remote show [remote-name]
git remote show origin ## 会列出远程仓库的URL和跟踪分支的信息
- 远程仓库的重命名与移除
git remote rename mygit newgit ## 把简写名mygit重命名为newgit
git remote rm newgit ## 移除远程仓库newgit
打标签
Git标签是给某一次特定的提交标识以示重要,如发布节点v1.0,使用两种类型的标签:
1.轻量标签 -- 只是一个特定提交的引用
2.附注标签 -- 存储在Git数据库中的完整对象,可以被校验。包括打标签者的名字,电邮,日期,和标签信息
- 轻量标签 git tag
git tag v1.0 ## 只需要提供标签的名字
git show v1.0 ## 轻量标签只会显示提交信息
- 附注标签 git tag -a -m
git tag -a v1.1 -m 'first tag' ## 选项-m 指定一条将会存储在标签中的信息,如果没有为附注标签指定一条信息,Git会运行编辑器要求你输入信息
git show v1.1 ## 附注标签会显示标签信息和提交信息
- 列出标签 git tag
git tag ## 这个命令以字母顺序列出所有标签
git tag -l 'v1.8.5*' ## 只列出1.8.5系列
- 后期打标签
git log --pretty=oneline ## 列出提交的历史记录
git tag -a v1.2 9fceb02 ## 为校验和为9fceb02的提交打标签
- 共享标签 git push origin [tagname]
git push origin v1.0 ## 默认情况下,git push 不会推送标签到远程仓库,需要你显式的推送标签
git push origin --tag ## 选项--tag把所有不在远程仓库的标签全推送到远程仓库
- 检出标签 git checkout -b [branchname] [tagname]
git checkout -b version2 2.0 ## Git并不能真的检出标签,想要工作目录与远程仓库中的特定标签完全一致,就可以在特定的标签上创建新的分支
Git 别名 -- 设置一个别名可以更快的输入
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --' ## 取消暂存
git config --global alias.last 'log -1 HEAD' ## 最后一次提交
git config --global alias.visual '!gitk' ## 用Git协作工具执行外部命令,要在命令前加上'!'
Git基础部分,常用的总结完毕,下次将总结Git 杀手锏——分支branch
参考资料:1.Git官网教程,官网写的比较详细,推荐看,
2.廖雪峰的Git教程简明,主要写了一些常用的命令。