目录
git 基础
git 版本查询
git的配置
获取git仓库
查看文件状态
跟踪新文件
忽略文件
查看已暂存和未暂存的修改
提交更新
移除文件
查看提交历史
撤销操作
重新提交
取消暂存文件
本地提交回退
远程仓库
查看远程仓库
添加远程仓库
从远程仓库中抓取与拉取
推送到远程仓库
查看某个远程仓库
远程仓库的重命名与
打标签
查看标签
创建标签
后期打标签
推送标签到共享服务器上
删除标签
检出标签
git 别名
git 分支
创建分支
切换分支
合并分支
删除分支
分支管理
远程分支
推送
切换
查看远程分支
拉取远程分支
删除远程分支
补丁
生成补丁
应用补丁
1.git apply
2.git am
SSH公钥生成
git --version
--global
:让所有仓库都生效
git config --global user.name "Finn Ma" #设置用户名,初次使用必须首先设置
git config --global user.email [email protected] #设置用户邮箱,初次使用必须首先设置
git config --global core.autocrlf false #关闭换行符类型转换
git config --global credential.helper store #保存凭证
git config --list #查看git配置
git config --show-origin #查看所有的配置以及它们所在的文件
git config --unset user.name #删除用户名配置
通常有两种获取 Git 项目仓库的方式:
将尚未进行版本控制的本地目录转换为 Git 仓库
git init
克隆现有仓库
git clone
git clone #指定新的目录名
#Example
git clone https://github.com/FinnMa1/test.git
git clone https://github.com/FinnMa1/test.git my_test
git status
git status 命令的输出十分详细,但其用语有些繁琐。git status -s
你将得到一种 格式更为紧凑的输出。
git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
??:未跟踪文件,A:新添加到暂存区中的文件,M:修改过的文件. 输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。例如,上面的状态报告显示: README文件在工作区已修改但尚未暂存,而 lib/simplegit.rb 文件已修改且已暂存。 Rakefile文件已修,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。
git add 命令使用文件或目录的路径作为参数;如果参 数是目录的路径,该命令将递归地跟踪该目录下的所有文件.
这是个多功能命令:可以用它开 始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这 个命令理解为“精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适
git add
#Example
git add README.txt
创建一个名为 .gitignore的文件,列出要忽略的文件的模式。 文件 .gitignore 的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中
匹配模式可以以(/)开头防止递归
匹配模式可以以(/)结尾指定目录
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反
cat .gitignore
*.[oa] # 忽略所有以 .o 或 .a 结尾的文件
*~ # 忽略所有名字以波浪符(~)结尾的文件
*.a # 忽略所有的 .a 文件
!lib.a # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
/TODO # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
build/ # 忽略任何目录下名为 build 的文件夹
doc/*.txt # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/**/*.pdf # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
github上数十种语言的.ignore详细示例: https://github.com/github/gitignore
git diff # 查看已经追踪但是尚未暂存的文件更新了哪些部分,即是没有git add
git diff --staged #对已暂存文件与最后一次提交(commit)的文件差异
git commit -m "some commit information" #将暂存区域文件提交
git commit -a -m "some commit information" #把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add,建议不要使用
git rm # 从暂存区域移除
git commit -m "remove the file under the git control."
git rm log/ # 删除log文件夹下的所有文件
git log # 查看所有历史
git log -1 # 最近一次的提交记录
git log -p # 每次提交所引入的差异
git log -p -1
git log --stat # 每次提交的最后列出文件增删修改等变化
git log --pretty=oneline # 每一次的提交在一行显示
git log --oneline # 每一次的提交在一行显示,sha值只保留部分
git reflog # 查看所有log
git log --oneline --decorate --graph --all #查看分叉历史
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有 --amend 选项的提交命令来重新提交:
git commit --amend
例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
git commit -m 'initial commit'
git add forgotten_file # 再次add忘记的文件
git commit --amend # 重新提交
最终你只会有一个提交——第二次提交将代替第一次提交的结果。
git restore #没add与commit时
git restore --staged #只add没有commit
git reset --hard 退到/进到指定commit的sha码
回退到以前的提交后,之前的commit log都会丢失,使用git reflog
可以看到
如果你已经克隆了自己的仓库,那么至少应该能看到origin——这是Git给你克隆的仓库服务器的默认名字
git remote
git remote -v # 查看远程仓库地址
git remote add
#Example
git remote add test https://github.com/FinnMa1/test.git
以后可以在命令行中使用
如果使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以“origin”为简写
git fetch
git fetch
git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。
git push
当你想要将 master 分支推送到origin服务器时(克隆时通常会自动帮你设置好两个名字),那么运行这个命令就可以将你所做的备份到服务器:
git push origin master # master为本地分支名, origin为远程服务器名
git remote show
#Example
git remote show origin
重命名
git remote rename
移除
git remote rm
git remote rm
一旦使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以配置信息也会一起被删除。
git tag
git tag -l "v1.8.5*" #查看v1.8.5开头的tag
轻量标签(lightweight)
本质上是将提交校验和存储到一个文件中——没有保存 任何其他信息。 创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字
git tag
#Example
git tag V0.1
git show V0.1 #你不会看到额外的标签信息,只有提交信息
附注标签(annotated)
附注标签是存储在 Git 数据库中的一个完整对象,它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证,一般使用附注标签
git tag -a -m "commit information"
#Example
git tag -a V1.0 -m "my version 1.0"
git show V1.0 # 输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息
可以对过去的提交打标签
git tag -a
#Example
git tag -a v1.2 9fceb02d0ae598e95dc970b74767f19372d61af8 #给0x9fceb02...那次提交打tag
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送标签到共享服务器上
git push origin
git push origin --tags # 将会把所有不在远程仓库服务器上的标签全部传送到那里
git tag -d
上述命令并不会从任何远程仓库中移除这个标签,需使用以下命令
git push origin --delete
如果你想查看某个标签所指向的文件版本,可以使用git checkout命令
git checkout V1.0
不要单独使用git checkout
命令,这会使你的仓库处于“分离头 指针(detached HEAD)”的状态,在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化,但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支
git checkout -b version2 V1.0
git config --global alias. command
#Example
git config --global alias.co checkout
git co # 等价 git checkout
git config --global alias.last 'log -1 HEAD'
git last #等价 git log -1 HEAD
git branch # 此时HEAD指针仍在当前分支
git checkout # 从当前分支切换到
git checkout -b #创建分支并且切换到该分支
git merge # 合并分支到当前分支下
git merge # 将分支1合并到分支2
git branch -d # 删除分支
分支前的 * 字符:它代表现在检出的那一个分支(也就是说,当前 HEAD 指针所指向的分支)
git branch # 查看本地当前分支
git branch -v # 查看本地分支最近一次提交信息
--merged
与 --no-merged
过滤这个列表中已经合并或尚未合并到当前分支的分支。
本地的分支并不会自动与远程仓库 同步——你必须显式地推送想要分享的分支
git push
如果你正在使用 HTTPS URL 来推送,Git 服务器会询问用户名与密码
如果不想在每一次推送时都输入用户名与密码,你可以设置一个 “credential cache”。 最 简单的方式就是将其保存在内存中几分钟,可以简单地运行
git config --global credential.helper cache
来设置它。
git checkout -b #从创建本地分支并且切换到该分支
#Example
git checkout -b serverfix origin/serverfix
git branch -a # 查看所有分支(本地与远程仓库)
git branch -vv # 查看本地分支关联的远程仓库分支
git pull #等同于git fetch 与 git merge
git push origin --delete
git format-patch -M origin/master # -M选项允许 Git 检查是否有对文件重命名的提交
git format-patch HEAD^ # 生成最近的1次commit的patch
git format-patch -1 # 同上
git apply 命令采用了一种“全部应用,否则就全部撤销(apply all or abort all)”的模型, 即补丁只有全部内容都被应用和完全不被应用两个状态 并且,它不会为你创建提交——在运行之后,你需要手动暂存并提交补丁所引入的更改。
git apply
在实际应用补丁前,使用 git apply 来检查补丁是否可以顺利应用—,使用 --check
命令
git apply --check
如果没有产生输出,则该补丁可以顺利应用。如果检查失败了,该命令还会以一个非零的状态退出,所以需要时你也可以在脚本中使用它
应用一个由 format-patch命令生成的补丁,你应该使用git am命令(该命令的名字am表示它“应用(Apply)一系列来自邮箱(Mailbox)的补丁”)
git am 会使补丁被顺利地应用,并且为你自动创建了一个新的提交
git am
进入~/.ssh目录,如果不存在改目录,则创建
mkdir .ssh #不存在才创建
cd ~/.ssh/
生成邮箱公钥 停顿处直接回车(总共3次)
git config --global user.name #没有设置才设置
git config --global user.email
ssh-keygen -t rsa -C "your email address" #直接次回车
#Example
ssh-keygen -t rsa -C "[email protected]"
生成的秘钥就保存在刚刚的.ssh文件夹下,其中id_rsa.pub就是公钥