1. Git安装
git在Linux、MAC、Window上的安装步骤见google,安装完成后,配置用户名与邮箱
$ git config --global user.name"Your Name"
$ git config --global user.email"email@example.com"
--global
表示全局配置,如果想单独为该项目配置,不添加该参数
若想取消全局配置:
$ git config --global --unset user.name
$ git config --global --unset user.email
修改配置后,如果想查看git配置文件:
$ cat ~/.gitconfig
也可以用:
$ git config user.name
或者
$ git config --global user.name
1.1 本文编辑器
Git 会使用操作系统默认的文本编辑器,通常是 Vim
。 如果你想使用不同的文本编辑器,例如 Emacs
,可以这样做:
$ git config --global core.editor emacs
如果你希望选择文本编辑软件,则:
$ git config --global core.editor="C:/'Program Files'/Notepad++/Notepad++.exe"
如果要删除默认文本编辑软件:
$ git config --unset --global core.editor
1.2 配置信息检查
要检查已有的配置信息,可以使用 git config --list
命令:
$ git config --list
你可以通过输入 git config <key>
: 来检查 Git 的某一项配置,例如:
$ git config user.name
如果想要需求git命令帮助,可以使用:
$ git help <verb>
例如,你想查看关于配置config的命令,可以
$ git help config
1.3 乱码信息处理
git bash终端也要设置成中文和utf-8编码。才能正确显示中文
在git bash的界面中右击空白处,弹出菜单,选择:Options->Text->Locale改为zh_CN,Character set改为UTF-8
status查看有改动但未提交的文件时总只显示数字串,显示不出中文文件名,这是因为中文文件名在工作状态传输,不能正确显示,处理方法:
$ git config --global core.quotepath false
2. Git版本库
2.1 创建版本库
首先选择一个地方,创建一个空目录
$ mkdir GitTest #创建一个GitTest的目录
$ cd GitTest
$ pwd
其中
pwd
用于显示当前目录
初始化仓库
$ git init
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中,若想看见这个.git文件,则:
$ ls -ah
2.2 克隆版本库
如果想要获得一份已经存在的Git仓库拷贝,则需要用git clone
命令,格式为git clone [url]
,例如:
$ git clone https://github.com/libgit2/libgit2
如果你想在本地自定义仓库名,可以使用:
$ git clone https://github.com/libgit2/libgit2 mylibgit #将远程仓库本地自定义名为mylibgit
2.3 推送仓库到远程
假设要连接到远程仓库(例如github):
判断是否在github上设置过SSH KEY,如果没有需要设置
创建SSH key
C盘用户目录下有没有.ssh
目录,有的话看下里面有没有id_rsa
和id_rsa.pub
这两个文件,有就跳到下一步,没有就通过下面命令创建
$ ssh-keygen -t rsa -C "youremail@example.com"
在用户下的.ssh目录里找到id_rsa
和id_rsa.pub
这两个文件
添加SSH key
登陆github,在setting中选中SSH and GPG KEYS
,选择new SSH key,把刚才id_rsa.pub
里面的内容复制到Title下面的Key内容框里面
在github上创建一个仓库,在本地仓库运行命令:
$ git remote add origin git@github.com:zhewendev/GitStudy.git
其中zhewendev/GitStudy.git
换成自己的github账号名与仓库名
本地内容推送到远程仓库
$ git push -u origin master
(新建的远程仓库是空的,所以要加上-u
这个参数,等远程仓库里面有了内容之后可以不加这个参数)
备注:
创建远程仓库的时候,如果你勾选了
Initialize this repository with a README
,会报错,由于你新创建的那个仓库里面的README文件不在本地仓库目录中,需要先合并:$ git pull --rebase origin master
之后再push就可以了
3. Git基础操作
![](https://img.haomeiwen.com/i8133609/58c9a0baf991c898.png)
3.1 提交流程
工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。
已跟踪的文件是指本来就被纳入版本控制管理的文件,而所有其他文件都属于未跟踪文件
要确定当前目录哪些文件处于什么状态,可以用git status
命令
git status
如果要跟踪(暂存)一个文件,使用git add
命令
git add . #跟踪当前工作目录下所有未跟踪文件
如果要跟踪指定文件,则在后面带上指定文件名,例如:
git add java.java
如果要查看指定文件修改的细节,可以使用git diff
命令:
$ git diff java.java #查看java.java这个文件的修改细节
diff --git a/java.java b/java.java
index f093797..0de4939 100644
--- a/java.java
+++ b/java.java
@@ -1,2 +1,2 @@
hello world
-nice to meet you!
\ No newline at end of file
+nice
\ No newline at end of file
前述示例可以看到代码nice to meet you!
被更改为nice
前述git status
输出的状态较为详细,如果想要查看简单状态报告,可以使用git status -s
或git status --short
:
$ git status -s #查看简单状态报告
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
??
:表示未跟踪文件A
:表示新添加到暂存区M
:右边的表示文件修改未放入暂存区,左边表示修改并放入暂存区
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
创建.gitignore
文件
touch .gitignore
之后就可以在.gitignore
文件中编辑需要忽略的文件了,其采用标准的glob模式匹配。
文件 .gitignore
的格式规范如下:
- 所有空行或者以
#
开头的行都会被 Git 忽略。- 可以使用标准的 glob 模式匹配。
- 匹配模式可以以(
/
)开头防止递归。- 匹配模式可以以(
/
)结尾指定目录。- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(
!
)取反。
glob模式即简化的正则表达式,详细语法规则可自行google查阅。
示例:在.gitignore
编辑
*.[oa] #忽略所有以.o或.a结尾的文件
查看已暂存的文件内容,可以使用git diff --staged
命令
git diff --staged
暂存区保存妥当,可以提交,使用git commit
命令
git commit -m"[D190920]提交java.java文件"
其中
-m
后面带这次提交的注释,不可缺
如果觉得git add太繁琐,想一次提交已跟踪的文件,可以在git commit
命令加 -a
git commit -a -m 'added new benchmarks'
移除文件,可以直接在文件管理器中将其删除,或者使用rm
命令
git rm jjj.docx #移除jjj.docx文件
这个时候Git版本库还存在这个文件,可以git rm
命令移除,然后提交
git rm jjj.docx
git commit -m"移除jjj.docx文件"
文件恢复:如果删错了,且还没有提交,可以将文件恢复
git checkout -- jjj.docx
git checkout
其实是用版本库里的版本替换工作区的版本
移动文件或重命名,需要使用git mv
命令
git mv jjj.docx test/ #将jjj.docx文件移动到test目录下
如果要重命名,示例:
git mv jjj.docx kkk.docx #重命名
3.2 提交历史
查看提交历史,这个时候需要用到git log
命令
git log
如果不带任何参数,则按提交时间列出所有更新。
可以在后面加各种参数,例如
git log -p -2 #最近两次提交和每次提交的内容差异
查看提交的简略统计,使用--stat
选项
git log --stat
在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了
指定不同默认格式的方式展示提交历史,使用--pretty
选项
$ git log --pretty=oneline
pretty
后面还可以带short
,full
,fuller
等
定制显示记录格式,可以用git log --pretty=format
命令
$ git log --pretty=format:"%h - %an, %ar : %s"
关于format后面选项写法与意义,参考:常用选项
关于git log后面携带的其他参数和各种参数的意义,可以参考前面的常用选项。
一般使用git log --oneline
查看log,简洁
3.3 撤销操作
提交信息修改:如果提交完发现有文件漏了或者提交信息错误时,可以运行带有 --amend
选项的提交命令尝试重新提交:
$ git commit --amend
版本回退
在Git中,用HEAD表示当前版本,即最新提交,上一个版本即HEAD^
,以此类推,往上100个版本可以写成:HEAD~100
当前版本回退到上一个版本,使用git reset
命令
$ git reset HEAD^
如果想要回退到指定的版本,reset后面带该版本的commitid即可
$ git reset 9abcfe5
git reset
命令不带--hard
参数则回退后当前的代码不会改变,如果带该参数,则代码等文件内容页回退到指定版本的内容
$ git reset --hard 9abcfe5
查看所有提交操作:git提供了git reflog
命令记录每一次命令
$ git reflog
撤销add操作:如果你将某文件add后又后悔了,可以使用git reset HEAD
命令
$ git reset HEAD jjj.docx
如果想撤销所有add的文件,则:
$ git reset HEAD
撤销文件修改:修改了某个文件但是又后悔了,想回退则:
$ git checkout -- jjj.docx
如果想想撤销工作区所有文件的修改,则:
$ git reset --hard HEAD
3.4 远程仓库操作
查看远程仓库,使用git remote
命令
$ git remote
查看远程仓库使用的Git保存简写和对应URL,需要带上-v
参数
$ git remote -v
查看某个远程仓库,使用git remote show [name]
命令
$ git remote show origin
会列出远程仓库的 URL 与跟踪分支的信息等等
远程仓库重命名,使用git remote rename
命令
$ git remote rename origin zhewendev
前述命令将origin远程仓库改为zhewendev了
3.5 标签操作
查看标签:查看所有已打标签,使用git tag命令:
$ git tag
如果只对某些标签感兴趣,可以使用特定模式查找,示例:
$ git tag -l 'v1.8.5*'
上述命令列出1.8.5 系列所有标签
创建标签:分为附注标签和轻量标签
-
附注标签:当你在运行
tag
命令时指定-a
选项,示例:$ git tag -a v1.0.0 -m"my version 1.0"
-m
选项指定了一条将会存储在标签中的信息。通过使用
git show
命令可以看到标签信息与对应的提交信息:示例:$ git show v1.0.0
输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息
-
轻量标签:轻量标签本质上是将提交校验和存储到一个文件中
$ git tag v1.0.0
-
后期创建标签:可以对过去提交打tag,假设提交历史为:
5f558d4 (HEAD -> master, origin/master) java.java文件提交 1053e9a 添加jjj.docx文件 df163fe [D190920]提交java.java文件 d61cc88 Initial commit
你想在
提交java.java文件
这个提交之后打tag,可以:$ git tag -a v1.0.0 df163fe
共享标签:将标签推送到远程分支,默认不共享,示例:
$ git push origin v1.0.0
如果要一次性推送多个标签
$ git push origin --tags
删除标签:删除本地分支标签,使用git tag -d
命令,示例:
$ git tag -d v1.4-lw
必须使用 git push <remote> :refs/tags/<tagname>
来更新你的远程仓库:
$ git push origin :refs/tags/v1.0.0
根据标签创建分支:通过git branch <new-branch-name> <tag-name>
命令,示例:
$ git branch test_dev v1.0.0
3.6 配置别名
配置别名:可以通过 git config
文件来轻松地为每一个命令设置一个别名,示例:
$ git config --global alias.st status
$ git config --global alias.ci commit
$ git config --global alias.unstage 'reset HEAD'
则git st
表示git status
命令,git ci
表示git commit
命令,git unstage
表示 git reset HEAD
命令其他命令由此类推
--global
参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。如果不加,那只针对当前的仓库起作用。
配置文件:
每个仓库的Git配置文件都放在.git/config
文件中,别名就在[alias]
后面,要删除别名,直接把对应的行删掉即可。
4. 分支操作
4.1 分支创建与合并
新建分支:使用git branch
命令,示例
$ git branch test_dev
切换分支:使用git checkout
命令,示例
$ git checkout test_dev
新建分支并切换:
$ git checkout -b test_dev
分支合并:假设你在test_dev修改了问题,并切换到master分支,将test_dev分支合并到master中
$ git merge test_dev
分支删除:若想删除某个分支,可以用git branch -d
命令,示例:
$ git branch -d test_dev
合并冲突:合并分支或者提交代码等情况可能存在冲突,情况可能如下:
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
这表示 HEAD
所指示的版本(也就是你的 master
分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(=======
的上半部分),而 iss53
分支所指示的版本在 =======
的下半部分。 为了解决冲突,你必须选择使用由 =======
分割的两部分中的一个,或者你也可以自行合并这些内容。
4.2 分支管理
展示分支:查看分支使用git branch
命令
$ git branch
查看每一分支最后提交:使用git branch -v
命令:示例
$ git branch -v
查看分支合并情况:查看哪些分支已经合并或未合并到当前分支,可以用--merged
与 --no-merged
这两个有用的选项,若分支已删除则显示不出:
$ git branch --merged
$ git branch --no-merged
4.3 变基操作
rebase
命令将提交到某一分支上的所有修改都移至另一分支上,示例:
$ git checkout experiment
$ git rebase master
它的原理是首先找到这两个分支(即当前分支 experiment
、变基操作的目标基底分支 master
)的最近共同祖先 C2
,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3
, 最后以此将之前另存为临时文件的修改依序应用
![](https://img.haomeiwen.com/i8133609/a7ee3e717d08844e.png)
现在回到 master
分支,进行一次快进合并。
$ git checkout master
$ git merge experiment
![](https://img.haomeiwen.com/i8133609/342c969ae8f06f56.png)
备注:不要对在你的仓库外有副本的分支执行变基。
5. 其他技巧
模糊记忆快捷键: Ctrl + R
,按Tab补充完整,按enter键直接回车执行,这里会显示之前输入过的命令。
网友评论