一 Git介绍
Git是一个开源的分布式版本控制系统,是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
工作区:就是你在电脑里能看到的目录。
暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6ctTQUj-1576815822428)(file:///gitpic\wps134A.tmp.png)]
二 本地仓库
1 基本使用
1)安装git
如果是ubuntu系统,采用如下命令:sudo apt-get install git
如果是Windows系统, 直接安装相关的git程序
2)配置用户和邮箱
git config --global user.name "renr"
git config --global user.email "123444@aliyun.com"
3)创建本地仓库的文件夹
mkdir git_repository
4)初始化仓库,切换到仓库文件夹
cd git_repository(Git905)
git init
初始化空仓库后,会生成一个.git目录
5)添加文件到仓库
新建一个hello.txt,然后
git add hello.txt 添加到暂存区
git commit -m “new” 提交更改
git checkout -- haha.txt 撤销修改
git reset HEAD haha.txt 添加过进行撤销操作
其中,git add把文件添加进去,实际上就是把文件修改添加到暂存区;
用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改
注意:如果是在仓库外建立文件,并添加,会提示错误
renr@renr-virtual-machine:~$ git add haha.txt
fatal: Not a git repository (or any of the parent directories): .git
或者
renr@renr-virtual-machine:~/git_repository$ git add ../haha.txt
fatal: ../haha.txt:'../haha.txt' 在仓库之外
2 其他命令
1)git status
对文件进行修改,通过git status查看状态
renr@renr-virtual-machine:~/git_repository$ vim haha.txt
renr@renr-virtual-machine:~/git_repository$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: haha.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
2)git diff
对比查看修改什么内容
renr@renr-virtual-machine:~/git_repository$ git diff haha.txt
diff --git a/haha.txt b/haha.txt
index 1d39138..c4c87d9 100644
--- a/haha.txt
+++ b/haha.txt
@@ -1,3 +1,6 @@
hello
world
+
+buhao
+caiguai
3) git log
查看修改的历史记录
git log
4)git reset
回退到上一个版本
git reset --hard HEAD^
如果是windows系统,^有特殊意思,该命令需要写为:
git reset --hard “HEAD^”
还可以使用:
git reset --hard HEAD~ 或者 git reset --hard HEAD~1
~ 后面的数字表示回退几次提交,默认是一次
根据版本号到一个版本
renr@renr-virtual-machine:~/git_repository$ git reset --hard b1aeb21
HEAD 现在位于 b1aeb21 insert info
使用该方式,可以实现前进到一个指定版本
5)git reflog
查看执行的每次的命令
renr@renr-virtual-machine:~/git_repository$ git reflog
b1aeb21 HEAD@{0}: reset: moving to b1aeb21
a35e20d HEAD@{1}: reset: moving to HEAD^
b1aeb21 HEAD@{2}: commit: insert info
a35e20d HEAD@{3}: commit (initial): write haha.txt
6)如何丢弃修改
修改,但是还没add时,使用status可以查看到如何丢弃
renr@renr-virtual-machine:~/git_repository$ vim haha.txt
renr@renr-virtual-machine:~/git_repository$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: haha.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
renr@renr-virtual-machine:~/git_repository$ git checkout -- haha.txt
修改后,add后,提交到暂存区,如果取消修改,使用reset
renr@renr-virtual-machine:~/git_repository$ vim haha.txt
renr@renr-virtual-machine:~/git_repository$ git add haha.txt
renr@renr-virtual-machine:~/git_repository$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: haha.txt
renr@renr-virtual-machine:~/git_repository$ git reset HEAD haha.txt
三 连接远程github中的仓库
1 建远程仓库
在github上建立仓库,默认会生成一个readme文件
注意看Readme文件中的提示
2 使用https连接
设置远程仓库地址
renr@renr-virtual-machine:~/git_repo$ git remote add origin https://github.com/renr1981/git_repo.git
注意:使用该连接方式,每次推送时,会要求输入github的用户名和密码
向远程库推送数据
renr@renr-virtual-machine:~/git_repository$ git push -u origin master
Username for 'https://github.com': renr_1981@aliyun.com
Password for 'https://renr_1981@aliyun.com@github.com':
对象计数中: 17, 完成.
压缩对象中: 100% (9/9), 完成.
写入对象中: 100% (17/17), 1.37 KiB | 0 bytes/s, 完成.
Total 17 (delta 0), reused 0 (delta 0)
To https://github.com/renr1981/git_repo.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
3 使用ssh(Secure Shell)连接
1) 在家目录下创建ssh key(会生成公钥和私钥文件),邮箱使用github账户
注意:如果使用ssh连接,需要进行该配置
renr@renr-virtual-machine:~$ ssh-keygen -t rsa -C "renr_1981@aliyun.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/renr/.ssh/id_rsa):
Created directory '/home/renr/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/renr/.ssh/id_rsa.
Your public key has been saved in /home/renr/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:QzyEYlYWzJNweoBZSxGxWGksHxn0fhFTNC8LYB1bKRQ renr_1981@aliyun.com
The key's randomart image is:
+---[RSA 2048]----+
| %%BE==. |
| ++XX*+o=.o |
| .*+oo.B.. . |
| .o . + o |
| . S . |
| . . |
| |
| |
| |
+----[SHA256]-----+
2) Github中设置key,key的内容来自.ssh/id_rsa.pub
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fijQcYqa-1576815822430)(file:///gitpic\wps13E7.tmp.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TIzpvgTJ-1576815822431)(file:///gitpic\wps1446.tmp.jpg)]
3) 本地库与远程库关联
renr@renr-virtual-machine:~/git_repo$ git remote add origin git@github.com:renr1981/git_repo.git
4 推送本地更新
第一次推送时:
git push -u origin master
-u参数,把本地的master分支内容推送的远程新的master分支,并把本地的master分支和远程的master分支关联起来
关联后,只要本地修改并提交,就可以通过如下命令进行吐送
git push origin master
有时可能会产生冲突,就可以进行强制推送
git push -f origin master -f表示强制推送
5 修改远程仓库地址
方法一:
git remote rm origin
git remote add origin git@github.com:XXX/XXX.git
方法二:
git remote origin set-url <URL>
把替换成新的url地址。
方法三:
直接修改.git/config文件
四 克隆远程库
1先在远程建立库
2 远程库克隆:git clone
renr@renr-virtual-machine:~$ git clone https://github.com/renr1981/new_repo.git
正克隆到 'new_repo'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.
检查连接... 完成。
3将远程库更新同步到本地
1)git pull origin master,该命令会自动合并有冲突的文件
renr@renr-virtual-machine:~/new_repo$ git pull
git pull origin master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.
来自 github.com:renr1981/new_repo
17c2e44..2fac4c0 master -> origin/master
更新 17c2e44..2fac4c0
Fast-forward
nihao.txt | 1 +
1 file changed, 1 insertion(+)
2)git fetch origin master,不会自动合并
使用该命令的流程一般是:
git fetch origin master 从远程的origin仓库的master分支下载代码
git log -p master.. origin/master 比较本地的仓库和远程参考的区别
git merge origin/master 把远程下载下来的代码合并到本地仓库,远程的和本地的合并
五 其他
1 分支相关命令
创建分支:git branch 分支名称
切换分支:git checkout 分支名称
创建并切换分支:git checkout -b 分支名称
查看分支:git branch
合并分支到当前分支:git merge 分支名称
删除分支:git branch -d 分支名称
2解决冲突
出现冲突的情况:
A和B修改相同的代码,A修改后,提交,B修改还没有提交,然后B直接通过update获取最新代码;
A和B修改相同的代码,A修改后直接提交,B修改后也直接提交
针对出现冲突情况,一般比较稳妥的方式是手动修改代码解决冲突后重新提交
如果文件有冲突,提示信息如下:
renr@renr-virtual-machine:~/new_repo$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.
来自 github.com:renr1981/new_repo
2fac4c0..1f18632 master -> origin/master
自动合并 nihao.txt
冲突(内容):合并冲突于 nihao.txt
自动合并失败,修正冲突然后提交修正的结果。