git学习笔记
Git
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
Git与SVN的区别:
- Git是分布式的,SVN不是
- Git把内容按元数据方式存储,SVN是按文件
- Git分支和SVN的分支不同
- Git没有一个全局的版本号
- Git内容完整性要优于SVN
第一个示例
安装git之后打开git bash,然后设置信息
git config --global user.name "lpzju"
git config --global user.email "liupeng.hust@foxmail.com"
全局化
git config --global
工作目录
pwd显示当前工作目录,ls查看文件
仓库
使用mkdir创建工作目录,使用git init将目录变成Git可以管理的仓库
添加
创建文件readme.txt,内容如下:
Git is a version control system.
Git is free software.
然后使用git add 文件名把文件添加到仓库,然后
git commit -m "wrote a readme file"
会出现如下内容
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
嗯,按照廖雪峰教程,这里确实是1个文件改动,2行内容插入
git add和git commit分开,git commit接自己注释内容
小结
- 首先创建文件夹(目录),使用mkdir
- 然后初始化将此目录变为仓库,使用git init
- 然后自己创建文件,进行数据输入等
- 再使用添加和提交,git add和git commit
修改
现在把readme.txt的内容修改如下:
Git is a distributed version control system.
Git is free software.
查看结果
然后保存,并使用git status查看
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
结果如下:
diff --git a/readme.txt b/readme.txt
index d8036c1..013b5bc 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
\ No newline at end of file
再次添加
git add readme.txt
如果遇到git报如下问题:
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory
我是用vim进行编辑,系统是windows,但是gitbash是linux命令,然后上面的意思是linux中换行是LF,但是windows换行是CRLF,下面用python输出一下
print("1"+"\r"+"2"+"\n"+"3"+"\r\n"+"4")
"""
2
3
4
"""
即\r
换行到行首,\r\n
才是到下一行行首
再次查看
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: readme.txt
再次提交
git commit -m "add distributed"
[master eb6bd24] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
又双叒叕查看
git status
On branch master
nothing to commit, working tree clean
小结
- 使用git status查看工作状态,可以看到文件是否修改
- 然后添加、提交、查看,和前面内容相同
版本回退
对文本再次修改
将readme.txt的内容改成如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
然后add、commit,这时我们想回到之前的版本,可以先查看日志
git log
这时会出来这个仓库的日志
Author: lpzju <liupeng.hust@foxmail.com>
Date: Sat Jan 15 16:37:02 2022 +0800
append GPL
commit eb6bd24bec09dc4b9cc7f9ac9c686f59008503d2
Author: lpzju <liupeng.hust@foxmail.com>
Date: Sat Jan 15 16:28:33 2022 +0800
add distributed
commit de7b3d7f5609bac09185540a5ad45b59d870d3dd
Author: lpzju <liupeng.hust@foxmail.com>
Date: Sat Jan 15 16:02:56 2022 +0800
wrote a readme file
能很清楚的看到做出的修改
回退
当前版本用HEAD
表示,往前则使用HEAD~n
,n表示前多少,那么回退则使用git reset --hard HEAD~n
git reset --hard HEAD~1
这样就会回退1个版本
查看文件
Linux系统下,查看文件使用cat命令(因为是在git bash下,所以可以使用linux命令)
cat readme.txt
Git is a distributed version control system.
Git is free software.
windows下,使用type查看文件
再次回退
现在已经从第三个版本回退到了第二个版本,那么是没有第三个版本的信息了,但如果这时候我们还想再去到第三个版本,那么要使用他的id号
git log --pretty=oneline
eb6bd24bec09dc4b9cc7f9ac9c686f59008503d2 (HEAD -> master) add distributed
de7b3d7f5609bac09185540a5ad45b59d870d3dd wrote a readme file
此时可以使用id号前几位即可回退
git reset --hard de7b
终极回退
上面的回退,是要找到id,但如果现在已经回退了,并且没有后面版本的id,那么需要使用如下命令:
git reflog
eb6bd24 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
3b4f5e8 HEAD@{1}: commit: append GPL
eb6bd24 (HEAD -> master) HEAD@{2}: commit: add distributed
de7b3d7 HEAD@{3}: commit (initial): wrote a readme file
Git回退示意图
┌────┐
│HEAD│
└────┘
│
└──> ○ append GPL
│
○ add distributed
│
○ wrote a readme file
┌────┐
│HEAD│
└────┘
│
│ ○ append GPL
│ │
└──> ○ add distributed
│
○ wrote a readme file
即,其实只是指向不同的版本号而已
小结
- 当前版本是HEAD,如果要回退的话,使用
git reset --hard id
- id不清楚时,可以使用
git log
- 如果还不清楚,那么可以使用
git reflog
工作区和暂存区
工作区就是当前工作目录
版本库就是git init
时创建的.git
文件
暂存区就是git add
时把文件放置的位置
然后使用git commit
就会把暂存区的东西全部放到HEAD所指向的分支
修改
git第一次修改add,这时候再进行git第二次修改,然后git commit,提交的是第一次修改的东西,如果想提交第二次修改的东西,需要对第二次修改的东西进行git add,再commit
撤销修改
如果是本地文件修改,还没有add,那么可以使用git checkout -- filename.xx
或者git restore filename.xx
如果是本地文件修改,已经add,那么可以使用git reset HEAD filename.xx
回到还没有提交的状态,然后再使用上面的checkout语句或者restore语句
如果已经commit了,那么使用git reset --hard HEAD 版本号
删除
在本地进行删除,使用rm语句即可,但如果已经上传过了,此时误删文件,可通过git restore xxx.xx
来进行复原
远程
重要的事情说三遍
重要的事情说三遍
重要的事情说三遍
一定要用git bash的2.35版本,不要用2.34版本
本来好好的连接github没问题,但是想着github经常连不上,下载也慢,就想用码云。然后2.34版本(windows)在push的时候,没有弹出要密码啥的,整的我不会了,花了一下午时间都没有解决,结果重新安装2.35版本,奇迹般地好了!!!
常用地几个操作:
git remote -v
git remote rm xx
git remote add
git push
分支
创建与合并
HEAD指向当前分支,比如当前分支为master,而分支指向最新提交,如当前commit一下,那么master就指向最新commit的内容
常用命令
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git bracn -d <name>
解决冲突
主要是merge,如果遇到冲突的,那么就需要手动来指定那个保留了
开发策略
实际中,master是稳定的,最好是在其他分支上进行合并,然后在大版本上进行合并到master
bug分支
遇到需要修改的bug,使用stash将当前分支对应的工作现场存储起来,后面使用git stash pop进行恢复
小结
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
标签
给HEAD指向的内容打上标签
如果直接使用git tag v1
,那么则会给当前HEAD指向commit打上v1的标签,如果想给之前的commit内容打上标签,那么根据提交的编号来打
git log --pretty=oneline --abbrev-commit
此条语句会显示历史提交信息,如下:
36805b2 (HEAD -> dev, tag: v1.0, origin/dev) dev hello
d23aff1 add merge
dba071c conflict
df07a2f master
d12a53d dev
04883af conflict fixed
273a3f7 & simple
26db4e4 AND simple
15899cc branch test
a1ee66f of files
80f884c git tracks changes
31c3638 stage and LICENSE
4c6b24b append GPL
9e68617 add distributed
00881b1 wrote a test.txt
这样,如果想给conflict
打上标签,那么可以使用git tag v0.9 dba071c
查看标签使用git show