Git学习
所有的版本控制系统,只能跟踪文本文件的改动(因为文本文件时有编码的,建议使用UTF-8),图片,视频只能监控到大小,无法知道内容。
注:只要是二进制编码格式,都无法进行版本控制监控内容
初学必看: 工作区和暂存区
文章目录
- Git学习
- git安装
- git config 配置指令
- git init创建版本库
- git add commit使用
- git commit --amend
- git status 查看状态
- git log 查看历史记录
- git checkout -- 撤销
- git rm [file]
- git remote 远程
- git push 推送
- git clone 克隆远程仓库
- git checkout -b 创建并切换分支
- git branch 查看当前分支
- git merge 合并分支
- git branch -d 删除分支
- git switch 切换分支
- git rebase 合并并取消分支
- 解决冲突
- gitk .
- git log .
- 分支管理策略
- git进阶
git安装
Debian或Ubuntu Linux,通过一条
sudo apt-get install git
老一点的Debian或Ubuntu Linux,要把命令改为
sudo apt-get install git-core
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可
git config 配置指令
git config 有system,global(用户级别),和local(当前仓库),三个设置从system–》global–》loacl 底层配置会覆盖顶层配置分别使用–system/global/loacl可以定位到配置文件
系统配置
git config --system --list
当前用户配置
git config --global --list
当前仓库配置
git config --local --list
git init创建版本库
mkdir testgit #创建一个空目录
cd testgit #进入此目录
git init #将目录变成Git可以管理的仓库
显示下面的提示,说明初始化成功
Initialized empty Git repository in /home/server/Gitrepositiry/learngit/.git/
git add commit使用
结合实践:
首先新建一个文件
ubuntu(windows直接右键创建编辑)
touch test.txt #创建一个文本,要在testgit目录下,即git仓库中
vim test.txt #随意编辑,如Hello Git!
git add test.txt #将文件交给git管理
git commit -m add Git status Test #将文件提交到仓库,并附加说明test
终端输出:
[master (root-commit) ad90cf0] test
1 file changed, 2 insertions(+)
create mode 100644 test.txt
git add [filename] #可以多次使用,添加多个文件,也可以git add .
添加当前目录下所有文件
git commit -m [message] #提交时加上提交信息,方便历史查找
git commit --amend
git commit --amend #重写上一次的提交信息,包括提交信息
#进入编辑模式
小写i:在光标所在行位置停止不动开始写入内容
大写I:在光标所在行行首开始写入内容
小写a:在光标所在行当前字符后开始写入内容
大写A:在光标所在行行尾开始写入内容
小写o:在光标所在行下一行开始写入内容
大写O:在光标所在行上一行开始写入内容
#退出编辑模式
:w:保存文本
:q:退出编辑模式
:w!:强制保存,在root用户下即使文本只读也可以强制保存
:q!:强制退出,所有改动不生效
:wq:保存并退出
git status 查看状态
修改test文件内容
vim test.txt #修改test.txt文件
Hello Git!
Git status Test
git status #查看状态
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
显示 test.txt文件被修改
git diff test.txt #查看文件修改内容
diff --git a/readme.txt b/readme.txt
index 46d49bf..c1bbf93 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
Hello Git!
+Git status Test
最后一行显示为绿色,前有 ‘ + ’,是添加的内容
接下来再使用
git add 和 git commit -m
命令可将将文件再次提交
再次输入 git status
On branch master
nothing to commit, working tree clean
显示无文件需要修改
git log 查看历史记录
git log #查看提交记录
commit 后面的字符串是版本号,哈希值
commit 248877a79e025cd4ce46db31994b645ffbcac414 (HEAD -> master)
Author: ****
Date: Fri Nov 12 11:17:27 2021 +0800
add Git status Test
commit 3f1755237d1908a2d48dcfa879a3fd5ee295a214
Author: ****
Date: Fri Nov 12 11:16:26 2021 +0800
add Hello Git
git log
命令显示从最近到最远的提交日志
git log --pretty==oneline
每条日志都只显示一行
多屏显示控制方式空格向下翻页 b向上翻页 q退出
git log --oneline
哈希值只显示部分
git reflog
#查看命令历史,以便于找回回退前的版本
git checkout – 撤销
git checkout -- [file]
#撤销工作区修改
此时尚未将文件添加到暂存区,手动删除,或者使用上述命令清楚该文件所有本次修改
若已经git add
git reset HEAD [file]
#回退暂存区内容,返回状态到未git add时
若已经git commit
到版本库
git reset --hard HEAD^
#回退到上一个版本,前提是尚未上传到远程仓库
git rm [file]
手动[rm]删除工作区文件,不会删除相应版本库文件
需要再进行 git add [file]
和 git commit -m [message]
去同步删除版本库内容
git rm
#删除工作区文件,并将这次删除放入暂存区
rm
删除文件,git commit
提交信息,删除版本库文件
误删文件,版本库中还存在,可以通过
git checkout -- [file]
#用版本库中的版本替换工作区的版本
git remote 远程
以github仓库为例
#git remote add 添加远程仓库
git remote add origin git@github.com:[你的GitHub账户名]/learngit.git
#查看当前远程仓库,根据名字删除
git remote -v
#删除当前配置的远程库地址,这里删除只是解除绑定,并不是物理删除
git remote rm origin
#本地关联远程仓库,推荐使用ssh方式。
#1.配置当前仓库的用户名,邮箱。配置全局config 后加 --global
git config user.name "***"
git confif user.email "***@**.com"
#2.生成密钥(SSH key),此处的邮箱只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。
#Gitee教程:https://gitee.com/help/articles/4181#article-header0
ssh-keygen -t rsa -C "your_email@**.com"
#按照提示完成三次回车,即可生成 ssh key,生成后,有信息告诉你位置,有私钥和公钥(**.pub)
将公钥中的内容添加的远程仓库的新建SSH key中。(设置中找)
#验证
#github
ssh -T git@github.com
#gitee
ssh -T git@gitee.com
#本地项目创建版本库
在项目跟目录下执行: git init
#连接远程库
#推荐使用ssh
git remote add origin git@github.com:yourName/repositoryname.git
git remote add origin https://github.com/yourName/repositoryname.git
#如果远程仓库中含有文件(Readme.md..),执行下面命令,没有跳过即可
git pull origin master
#上面命令执行未成功,试试 git pull --rebase origin master
git push 推送
使用命令git push -u origin master
第一次推送master分支的所有内容,并与远程仓库绑定
下次提交只输入 git push origin master
即可
git clone 克隆远程仓库
获取到远程仓库git地址后使用
git clone [远程仓库地址]
#根据远程库克隆出一个本地仓库
Git支持多种协议,包括https
,但**ssh
协议速度最快**。
git checkout -b 创建并切换分支
git checkout -b [BranchName]
创建一个分支并将HEAD指针切换到此分支
相当于git branch [BranchName]
和
git checkout [BranchName]
git branch 查看当前分支
当前分支前面会有一个 * 号;
我们可以在分支上进行提交,未完成的文件;
完成之后git checkout master
切回master,此时master是看不到分支修改的内容的
git merge 合并分支
git merge [BranchName]
合并指定的分支到当前的分支
git branch -d 删除分支
git branch -d [BranchName]
#删除指定的分支
git switch 切换分支
git switch -c [BranchName]
#创建并切换到新分支
git switch master
#切换到已有的master分支
git rebase 合并并取消分支
让分支历史看起来像没有经过合并一样
解决冲突
当两条分支在同一个节点,同一个文件内容不一样时,想要合并,我们需要解决冲突,使当前节点只保存一个版本内容
git status
#告诉我们冲突的文件
冲突文件中,Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容
对冲突文件修改之后,git add
和git commit
提交修改,完成解决冲突
git branch -d [branch]
#删除分支,防止之后操作失误
git log --graph
#可以查看到分支合并图
gitk .
图形化查看当前文件夹下修改历史
git log .
查看最近几次历史日志。
分支管理策略
git 分支很强大,但是我们不能滥用分支。
master分支应仅用来发布新版本,平时不能在上面进行修改
创建dev分支作为开发使用的分支,
其他人各有各的分支,只在dev上进行合并
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并