一、安装GIT
- 安装homebrew
- 安装xcode
二、基础配置
git config —-global user.name "Your name"
git config -—global user.email "yourEmail@example.com"
查看设置是否成功
git config user.name
基本操作
add、commit
添加
git add <file>
提交
git commit -m <message>
代理
git config --global http.proxy "<http://127.0.0.1:8080>"
git config --global https.proxy "<http://127.0.0.1:8080>"
三、时光机
git status
查看现在仓库的状态,会返回现在仓库哪些文件改动过和其他的信息
git diff
看得是工作区该文件与版本库中当前分支上该文件之间的差异
严格地说,不一定,还可能是缓存区和仓库的区别,但在此处,我们简单的理解为上述情况。
-
如何看懂
diff的结果diff –-git a/f1 b/f1 index 8f86bb9..d74049c 100644 - a/f1 +++ b/f1 @@ -1,7 +1,7 @@ code code code -code +code code code code- 第一行表示结果为git格式的diff
diff --git a/f1 b/f1进行比较的是,a版本的f1(即变动前)和b版本的f1(即变动后)。 - 第二行表示两个版本的git哈希值和最后的六位数字是对象的模式
index 7a67204..8213f76 100644index区域的7a67204对象,与工作目录区域的8213f76对象进行比较。100代表普通文件,644代表文件具有的权限(同linux文件权限) - 第三四行表示进行比较的两个文件
a/f1+++ b/f1"-“表示变动前的版本,”+++"表示变动后的版本。 - 第五行表示代码变动的位置用两个@作为起首和结束
@@ -1,7 +1,7 @@"-1,7″分成三个部分:减号表示第一个文件(即f1),"1″表示第1行,“7″表示连续7行。 合在一起,就表示下面是第一个文件从第1行开始的连续7行。 同样的,”+1,7″表示变动后,成为第二个文件从第1行开始的连续7行。 - 第三部分是变动的具体内容
code变动的行,上下文各显示3行。将两个文件上下文合并显示在一起。 每一行最前面的标志位:“-”代表第一个文件删除的行用红色表示,“+”表示第二个文件新增的行用绿色表示,无标志表示该行无变动。
- 第一行表示结果为git格式的diff
提交修改的步骤
提交修改的步骤和添加文件的步骤是一样的
git add modified_file_namegit commit -m "comment"
版本回退
查看过去的版本
git log -n 3 --pretty=oneline
其中
-
-n 3→ 查看过去的三个版本 -
--pretty=oneline→ 美化结果为一行如果希望以图的形式展示分支结构
-
--graph结果
# 美化的 # commit_id ... comment 9cda832cca9f6c1cf77eae5afa42e3b5d7af3580 (HEAD -> master) add version 3 272ad41ad60b17bd6e00506da5166953dcfc4ede add version 2 e245982e0e475d8a2c84209adaff560b7e42eadb add version 1 # 不美化的 commit 272ad41ad60b17bd6e00506da5166953dcfc4ede Author: dong1iu <dong1iu@qq.com> Date: Sun Jun 13 13:51:24 2021 +0800 add version 2 commit e245982e0e475d8a2c84209adaff560b7e42eadb Author: dong1iu <dong1iu@qq.com> Date: Sun Jun 13 13:50:51 2021 +0800 add version 1 dong1iu@IMAC-dong1iu gittest % git log -n 1 commit 9cda832cca9f6c1cf77eae5afa42e3b5d7af3580 (HEAD -> master) Author: dong1iu <dong1iu@qq.com> Date: Sun Jun 13 13:52:11 2021 +0800
回到过去的版本
git reset --hard HEAD^
HEAD指向的版本就是当前版本
工作区、暂存区和库
⭐网络上很多博客关于这一部分的讲述都是不清晰的,我整理了廖雪峰git教程下网友的评论,以下是我认为正确的内容
逻辑结构
-
工作区(woking directory)
-
版本库
- 暂存区(stage or index)
- 库(head)
添加过程
注意: git的任务是完成版本管理,所以在底层其实就是移动数据。
初始化完成后,三个区域都是空的
在编辑一个新的readme.md文件(v1)后,工作区会出现一个新的untracked文件,此时你add到缓存区,然后修改readme.md文件(v2)。到现在为止,你的工作区和缓存区很明显是不同的,指令git diff就是比较你的工作区和缓存区的不同。
现在,你在不add的情况下,直接将没有重新add的缓存区commit到你的库(head),自然你的库中应该是保存的你第一次编辑的readme.md文件(v1)。注意,此时你的缓存区不是"清空"的状态,而是和commit前保持一样的状态,区别是你的缓存区和head的状态一致,所以git status提示你的nothing to commit, working tree clean
那么如何比较你的工作区和库呢?答案是git diff HEAD -- filename
总结
比较工作区和缓存区 → git diff
比较工作区和库 → git diff HEAD -- filename
比较缓存区和库 → git diff -cached
比较不同库版本 →git diff 243550a 24bc01b →git diff commit_id1 commit_id2
git add的逆操作 → git checkout -- filename
注意:
git add本质是把暂存区的数据同步为工作区的数据,而checkout是将工作区的数据同步为stage中的数据。--不能少,有空格,不然命令会出错,变成了“切换到另一个分支”的命令,git checkout --filename在新版git中现在被git restore替代- 原来的
git reset HEAD可以使用git restore --staged代替 - 原来的
git checkout branchName可以用git switch branchName代替。
撤销add → git restore --staged <file>...
unstage操作,取消add操作
删除文件
在工作区删除文件
rm filename
从库中删除文件
git rm filename
git commit -m "delete filename"
恢复被删除的文件
git restore filename或git checkout -- filename
原理上来说,缓存区的文件和版本库的文件是一致的,所以你可以从缓存区恢复你的文件。
回滚单独的某个文件
git checkout commit_id filename
远程仓库
如何连接到你的远程仓库
-
注册你的github账号
-
创建SSH key
ssh-keygen -t rsa -C "youremial@example.com"一般在
用户主目录/.ssh下,里面有id_rsa和id_rsa.pub两个文件,前者是私钥,后者是公钥。注意:千万不要丢失自己的私钥!!!
-
添加公钥到github账号
Account settings → SSH and CPG keys → new ssh key
添加远程库
创建新的仓库
在github仓库主页上 new repository
关联本地仓库
git remote add origin git@github.com:dong1iu/learngit.git
远程库的名字就是origin
推送
git push -u origin master
第一次时使用-u代表关联,把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。以后可以简单是使用git push origin master
notes: -f参数可以强制推送
删除远程库连接
git remote -v → 查看远程库信息
git remote rm origin → 删除本地仓库连接远程仓库(比如github上的learngit仓库)的连接。
注意:
git push origin -d dev → 删除远程数据库上的分支
如何理解Origin
origin其实只是一个别名,按照我的理解,他是代表你本地仓库到远程仓库这个连接的名字。因为你push的时候需要知道你push到哪儿去了,所以你要指名这个连接,而完整的连接名太长,也不方便记忆和理解,所以使用origin来作为别称。另外,你从github上clone代码的时候,github会自动的把这个连接称为origin。
从远程库克隆
git clone git@github.com:dong1iu/gitskills.git
分支管理
首先我们要明白git分支的工作原理
请参看廖雪峰分支管理
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
创建和合并分支
创建分支
git branch branchname
切换分支
git switch branchname
注意:当你切换分支时,HEAD的位置会变化,也就是说,你在某个分支上做的变化,在另一个分支上是看不到的
查看分支
git branch
* dev
master
星号代表当前HEAD所在分支
创建并切换分支
git switch -c branchname
合并某分支到当前分支
git merge branchname
删除分支
git branch -d branchname
删除远程上的分支
git push origin -d dev
分支冲突
在分支master和分支dev中分别修改readme.md的最后一行然后add并commit,merge的时候会发生冲突
此时处理的方式
-
放弃merge
git merge --abort -
修改冲突的文件并提交
-
vim conflict_file<<<<<<< HEAD Creating a new branch is quick & simple. ======= Creating a new branch is quick AND simple. >>>>>>> dev -
git add conflict_file -
git commit -m "merge conflict fixed"
-
分支策略
默认的情况下,git的merge采用fast forward策略,这种策略比较快,但是在改模式下,删除分支后会失去信息,使用--no-ff参数禁用fast forward策略
.png)
标签管理
创建标签
查看便签
git tag
添加便签
git tag <name>
给过去的commit_id添加标签
git tag <name> <commit_id>
查看已有的便签
git tag
查看标签信息
git show <tag>
其他说明
- 用
-a指定标签名,-m指定说明文字 - 标签不是按时间顺序列出,而是按字母排序的
操作标签
删除
git tag -d v0.1
推送某个标签
git push origin v1.0
Github
查看当前的远程库
git remote -v
提取远程仓库
从远程仓库下载新分支与数据
git fetch
从远端仓库提取数据并尝试合并到当前分支
git merge
推送到远程仓库
git push -u origin master
删除远程仓库中的分支
git push origin -d dev → 删除远程数据库上的分支