Git使用
PS:命令前需添加git执行
1.个人本地使用
行为 | 命令 | 备注 |
---|---|---|
初始化 | init | 在本地当前目录初始化git仓库 |
clone(远程仓库地址) | 将远程仓库(remote repository)拷贝到本地 | |
查看当前转态 | status | 查看当前仓库状态(本地),遇到问题的时候可以通过该命令获取提示 |
查看不同 | diff | 查看当前文件状态和commit到本地仓库文件之间不同的地方 |
diff 版本号1 版本号2 | 查看指定两个版本之间不同的地方 | |
添加文件 | add -A/文件名 | 将工作区文件添加到缓存区 |
撤回修改且未缓存的内容 | checkout – . | 小数点表示撤回所有修改 |
提交 | commit -m “提交信息” | 提交信息体现修改了什么 |
删除untracked文件 | clean -xf | 删除当前目录下未追踪的文件,不管它是否是.gitignore文件里面指定的文件夹和文件 |
查看提交记录 | log | 查看当前版本及之前的commit记录 |
reflog | HEAD的变更记录 | |
版本回退 | reset --hard 版本号 | 回到指定版本号的版本(旧版本或最新版本) |
2.个人使用远程仓库
行为 | 命令 | 备注 |
---|---|---|
查看全局配置 | config --list --global | |
设置用户名 | config --global user.name “名字” | |
设置邮箱 | config --global user.email “邮箱” | |
生成ssh key | ssh --keygen -t rsa -C “邮箱” | 不用加git |
添加远程仓库 | remote add origin 远程仓库地址 | |
上传并指定默认 | push -u origin master | 指定origin为默认主机,以后push默认上传到origin上 |
提交到远程仓库 | push | |
从远程仓库同步 | pull |
- workspace即工作区,逻辑上是本地计算机还没有添加到repository
- staging即版本库中的stage,是暂存区,修改已经添加进repository,但还没有作为commit提交,类似于缓存
- local repository,只有到这一步才算是成功生成一个新版本
- remote repository 是远程仓库,用来将本地仓库上传到网络,用于备份、共享、合作。
3. Git下载
PS: Git for Windows从2.8.0版本开始,默认添加环境变量,可以不用手动配置环境变量
4.本地Git使用
1.新的仓库==>初始化
选择想要创建仓库的文件夹,右键并点击Git Bash Here
运行git init
来初始化仓库, 如下:
2.文件的添加和提交
在文件夹中创建一个happyday.txt
的文件并添加内容Happy Mid-Autumn Festival!
.
使用git status
查看有什么变化:
显示有两个未追踪文件,并提示可以使用git add <file>...
命令。
使用git add -A
命令:
图中显示警告,除此之外什么都没有,可以再次通过git status
查看状态:
状态改变,提示Change to be committed
(也就是可以执行commit),并说明如何将文件从stage移出
执行git commit -m "提交信息"
将文件提交到repository里:
运行git log
就可以看到提交记录:
为什么设计暂存区
3.文件的修改
修改happyday.txt文件的内容为Everyone, Happy Mid-Autumn Festival!
执行git status
命令:
给出提示,修改未添加到缓存区,说明可以使用git add <file>...
将更新添加到stage,然后commit,或者执行git checkout -- <file>...
来撤销修改
执行git diff
查看文件做了哪些修改:
默认比较对象为提交的最新版本。
红色(前面有-
号)表示删除,绿色(前面有+
号)表示添加,因此,在git看来,所做出的的修改操作为,删除之前的行,添加了新的一行。
PS: 如果使用Windows创建txt文件,并用自带的文本编辑器来编辑文本,得到的编码是GBK。而Git读取文件是,使用UTF-8无ROM编码,因此会出现中文无法正常显示的问题。
执行git checkout -- .
撤销修改,并用git status
查看状态:
之前的状态提示已经消失,执行vim happyday.txt
查看文件:
之前的改动已经撤销
现在再次更改文件,然后建立版本,使用git log
来查看提交
git add -A
git commit -m "add Everyone"
git log
现在显示有两个提交
4.版本回退
在之前的版本修改了部分内容,并且提交了,突然发现之前删除的内容是需要的可以进行版本回退
执行git log
查看版本:
其中两行黄色部分已commit
开头的,后面是一串16进制字符,是一串哈希值,也就是版本号。
执行git reset --hard 7b6381c
(取版本号前7位就可以),使用git log
查看版本:
提示HEAD已经更改指向7b6381c了,同时可以看到之前提交的最新版本记录消失了
如果想要回到最新版本,可以执行git reflog
查看版本更换情况:
可以看到HEAD的变化情况,第一行表示当前版本号是7b6381c,其他由上到下表示最新的版本号
再次执行git reset --hard cbfd936
命令,回到之前版本:
回到了第一次reset前的状态。
5.清除未追踪文件
通常在reset或者pull之前要做两件事:
- 将新添加且未追踪的文件删除(比如编译程序后所产生的文件)
- 已追踪的文件已有修改,但又不需要这些修改,将他们还原
删除文件演示:
vim delete.txt // touch delete.txt
git clean -xf // rm -rf delete.txt
PS: git clean -xf
将会把所有untracked文件全部删除(包括.gitignore设定的untracked文件),一旦清除,再也找不回来,谨慎使用
6. git status中文乱码问题
如果执行git status
产生中文乱码,可以执行:
git config --global core.quotepath false
如果执行git log
也产生乱码,可以执行:
git config --global il8n.commitencoding utf-8
git config --global il8n.logoutputencoding utf-8 #utf-8 由需求决定
5. Git Hub与Git关联
1. 本地Git 与 Git Hub的连接
- 到Git Hub注册账号
- 本地配置用户名和邮箱:
git config --list --global # 查看本地全局配置
git config --global user.name "用户名"
git congig --global email "邮箱"
- 生成ssh key
运行ssh-keygen -t rsa -C "邮箱"
会有三次输入直接回车即可。
PS: 上图为已有ssh key提示
将生成好的ssh key复制到剪贴板,执行clip < ~/.ssh/id_rsa.pub
(或者到上图显示路径粘贴)
- 打开Git Hub,进入Setting:
点击左边的SSH and GPG keys
,将ssh key粘贴到右边的Key里面,点击Add SSH key
回到Git bash,执行ssh -T git@github.com
:
如图所示,添加成功。
2. 创建远程仓库并与本地关联
填好Repository name后,点击Create repository,远程仓库创建成功
-
将远程仓库和本地仓库关联
复制远程仓库SSH地址:
PS:有两种方式可以关联,一种是SSH,一种是HTTPS.由于HTTPS比较慢,所以推荐使用SSH。
运行git remote add origin SSH地址
:
如果在创建repository的时候,加入了README.md或者LICENSE,那么GitHub会拒绝本地的push命令,那么需要先执行git pull origin master
。
执行git push -u origin master
将本地仓库上传至GitHub仓库进行关联:
如图所示关联已完成,并可以在GitHub上看到修改:
PS: 如果想更换本地仓库位置,可以将.git文件转移到相应目录下,然后提交就可以了
扩展
深入理解Git
移动git仓库
.gitignore
Git中以.gitignore文件定义哪些文件将被Git排除跟踪,被.gitignore匹配到的文件将不会显示在Git的Untracked files列表
.gitignore文件控制Git仓库中应排除跟踪的文件(可由文件类型、路径、通配符等确立)
常用规则
- 配置语法
以斜杠/开头表示目录
以星号*通配多个字符
以问号?通配单个字符
以方括号[]包含单个字符的匹配列表
以感叹号!表示不忽略匹配到的文件或目录
PS: git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着前面的规则匹配范围更大,则后面的规则将不会生效(!开头与非!开头的匹配互不影响)
- 示例说明
规则:test/*
表示忽略目录test下的所有内容(不管是根目录下==/test/还是子目录下/child/test/==)
规则:*.zip
表示忽略所有.zip类型文件
规则:
/*
!.gitignore
表示忽略全部内容,但是不忽略.gitignore文件
PS: Windows中,文件路径使用正斜杠/
分隔符,而不是反斜杠
创建.gitignore文件
- 常规Windows操作
- 根目录下创建gitignore.txt文件;
- 编辑gitignore.txt,写下规则;
- 打开命令行窗口,cd 根目录(直接在文件夹上面的地址栏输入cmd,回车);
- 执行命令
ren gitignore.txt .gitignore
;
- 用Git Bash
- 进入bash命令窗口;
- 输入
vim .gitignore
或touch .gitignore
命令,打开文件(没有文件会自动创建); - 按
i
键切换到编辑状态,输入规则,按Esc
键退出编辑,输入:wq
保存退出;
如下:
# 注释
/test/
忽略已提交文件中的变化
- 临时忽略变更
临时忽略本地仓库中已提交的文件的变更
git update-index --skip-worktree <file>
git update-index --assume-unchanged <file>
恢复追踪
git update-index --no-skip-worktree <file>
gir update-index --no-assume-unchanged <file>
- 永久忽略变更
如果一个文件已被Git跟踪,那么再将这个文件添加到.gitignore
中不会忽略文件变更,需要从Git暂存区(index)中移除这个文件信息,步骤如下:
-
在
.gitignore
中添加这个文件 -
从暂存区移除文件信息、提交删除文件和更新.gitignore文件
git rm --cached <file>
git add .
git commit -m 'update .gitignore'
git commit -m "update .gitignore" //windows使用命令是双引号
PS: 如未被追踪,直接在.gitignore文件中添加匹配,然后提交就可以了
- 仅在个人系统中忽略文件
.gitignore
文件被提交并被推送后,就会团队共享,若只是在系统上排除文件,可以编辑本地仓库中的.git/info/exclude
文件,修改这个文件不会共享给其他人,这个动作只对本地仓库有效