首页 > 其他分享 >Git教程

Git教程

时间:2023-07-10 22:45:31浏览次数:46  
标签:md 教程 git dev Git master 分支

Git教程

目录

1. 安装Git

1.1 在Linux上安装Git

可以在终端中输入git来查看系统是否安装git:

$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
  • Debian或Ubuntu Linux安装git:sudo apt-get install git
  • 老版本的Debisn或Ubuntu Linux安装git:sudo apt-get install git-core
  • 其他Linux版本:可以直接通过源码安装,从官网下载源码,然后解压,依次输入:./configmakesudo make install

1.2 在windows上安装Git

直接从官网上下载Git,默认安装即可。
安装完成之后,打开Git bash,需要在命令行中输入以下命令配置用户名称和邮件:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

可以使用git config -l命令查看git配置项详情:

$ git config -l
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager
user.name=lingyulong
[email protected]

2. 创建版本库

版本库又叫仓库(reposity),可以简单地把它理解成一个目录,这个目录里的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。

2.1 创建一个版本库:

  • 在合适的路径下,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
D:\Dev\Projects\Test_Projects\learngit
  • 使用git init命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in D:/Dev/Projects/Test_Projects/learngit/.git/

此时,Git已经把仓库建好了,但是现在是空的仓库,此时,当前目录下多了一个.git目录,这个目录是Git用来跟踪管理版本库的,通常情况下该目录是隐藏的(ls -ah),不要对.git目录做修改,否则会破坏该仓库。

Git只能跟踪文本文件的改动,如txt文本、源代码、md文档等,Git可以告诉我们对代码仓库的每次改动,如对某源代码文件的某行进行了怎样的修改,对于图片、视频、音频等二进制文件,虽然也受Git的管理,但Git无法追踪这些二进制文件的变化。

文本文件建议使用UTF-8编码。

2.2 添加文件到版本库

编写一个想上传上版本库的文件,之后将它放入版本库的目录(或子目录)下:

# ReadMe.md
This is a introduce of the respository.
  • 把文件添加到版本库:
$ git add ReadMe.md
  • 使用命令git commit -m "<comment>"把文件提交到仓库:
$ git commit -m "write a readme.md"
[master (root-commit) 7de169f] write a readme.md
 1 file changed, 1 insertion(+)
 create mode 100644 ReadMe.md
  • 一次添加多个文件到版本库
$ git add file1.txt file2.txt file3.txt

3. 版本管理

3.1 查看代码仓库的状态

git status命令可以查看当前代码库的状态:

$ 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:   ReadMe.md

no changes added to commit (use "git add" and/or "git commit -a")

上面的结果说明ReadMe.md文件被修改了,可以使用git diff <filename>查看文件的具体修改:

$ git diff ReadMe.md
diff --git a/ReadMe.md b/ReadMe.md
index ed0ed65..e35eac2 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -1 +1,2 @@
 This is a introduce of the repository.
+Modify test.

修改之后需要再次添加修改的文件:

$ git add ReadMe.md

再次查看代码库状态:

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   ReadMe.md

可以看到提示了将会提交的修改是ReadMe.md

修改完成之后,可以把修改提交:

$ git commit -m "ReadMe.md Modified"
[master 660ec15] ReadMe.md Modified
 1 file changed, 2 insertions(+), 1 deletion(-)

提交完成之后,再次查看代码库,Git将会告诉我们当前没有修改需要提交:

$ git status
On branch master
nothing to commit, working tree clean

3.2 版本穿梭

使用git log命令可以查看最近的git commit记录:

$ git log
commit 660ec15d617cb2698ee1819db5ee860f860660f8 (HEAD -> master)
Author: lingyulong <[email protected]>
Date:   Fri May 19 22:20:06 2023 +0800

    ReadMe.md Modified

commit c05ea785001759ae79a3991b250e97f96e9fbcf5
Author: lingyulong <[email protected]>
Date:   Fri May 19 21:36:08 2023 +0800

    ReadMe.md modify test

commit 7de169f5053e874ca34a4e5f908f9cc256c6bf92
Author: lingyulong <[email protected]>
Date:   Wed May 10 09:46:31 2023 +0800

    write a readme.md

或者加上--pretty=oneline参数简化输出信息:

$ git log --pretty=oneline
660ec15d617cb2698ee1819db5ee860f860660f8 (HEAD -> master) ReadMe.md Modified
c05ea785001759ae79a3991b250e97f96e9fbcf5 ReadMe.md modify test
7de169f5053e874ca34a4e5f908f9cc256c6bf92 write a readme.md

上面的每行commit提交的第一个长字符串其实是commit id,它是SHA1算法计算出的大数字,用16进制表示;

HEAD表示当前的版本,也是最新的提交,若想回到过去,可以使用git reset --hard HEAD^命令(回退到上上个版本就是HEAD^^):

$ git reset --hard HEAD^
HEAD is now at c05ea78 ReadMe.md modify test

此时再使用git log查看现在代码库的版本状态:

$ git log
commit c05ea785001759ae79a3991b250e97f96e9fbcf5 (HEAD -> master)
Author: lingyulong <[email protected]>
Date:   Fri May 19 21:36:08 2023 +0800

    ReadMe.md modify test

commit 7de169f5053e874ca34a4e5f908f9cc256c6bf92
Author: lingyulong <[email protected]>
Date:   Wed May 10 09:46:31 2023 +0800

    write a readme.md

可以看到,之前最新的"ReadMe.md Modified"版本已经不见了,想要再重返未来可以根据commit id回退:

$ git reset --hard 660ec
HEAD is now at 660ec15 ReadMe.md Modified

Git使用git reflog来记录版本记录(包括已经回退前的未来的版本):

$ git reflog
660ec15 (HEAD -> master) HEAD@{0}: reset: moving to 660ec
c05ea78 HEAD@{1}: reset: moving to HEAD^
660ec15 (HEAD -> master) HEAD@{2}: commit: ReadMe.md Modified
c05ea78 HEAD@{3}: commit: ReadMe.md modify test
7de169f HEAD@{4}: commit (initial): write a readme.md
  • 回到过去前,可以使用git log查看提交历史,以便回退到过去;
  • 若要重返未来,可以使用git reflog查看所有版本记录,以便重返未来;

3.3 工作区和暂存区

  • 工作区:工作区就是代码的目录,如learngit文件夹就是一个工作区
  • 暂存区:工作区中有一个隐藏的目录.git,它是Git的版本库,版本库中最重要的就是暂存区(stage或index)、分支master、和指向当前master的指针HEAD

git-repo

当我们把文件往Git版本库中添加的时候,实际上是分两步完成的:

  • 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  • 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

git add可以把文件添加到追踪名单中,没有被git add的文件将是Untracked的状态

3.4 管理修改

Git管理的是修改而不是文件!

对于以下流程:

第一次修改README.md -> git add README.md -> 第二次修改README.md -> git commit -m "first modification"

提交后的结果为README.md保持第一次修改时的状态,第二次修改并没有被提交,这是因为Git管理的是修改而不是文件——第一次修改通过git add被放入了暂存区,但是第二次修改并没有通过git add放入暂存区,因此git commit提交暂存区的修改后,只有第一次修改被提交了!

3.5 撤销修改

可以使用git checkout -- <file>来丢弃工作区的修改:

$ git checkout -- README.md  # 注意--前后都有空格

git checkout --README.md有两种意思:

  • 一种是README.md自修改之后还没有被放到暂存区,现在撤销修改就回到和版本库一样的状态;
  • 一种是README.md已经添加到暂存区之后,又做了修改,现在撤销修改就回到添加到暂存区的状态;

总之,git checkout --README.md就是让文件README.md回到最近一次git commit或者git add时的状态

3.6 删除文件

通常情况下,若在文件管理器中把不需要的文件删了或使用rm命令删了:

$ rm test.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    test.txt

no changes added to commit (use "git add" and/or "git commit -a")

此时,git将会知道删除了文件,因此工作区和版本库就不一致了

  • 若是确实要删除该文件,那么就用git rm将文件删掉,并且git commit:
$ git rm test.txt
$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt
  • 若是误删文件,则可以使用git checkout -- <file>来恢复文件:
$ git checkout -- test.txt

注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

4. 远程仓库

4.1 创建和添加SSH秘钥

  1. 创建SSH Key

在Git bash中执行以下命令:

$ ssh-keygen -t rsa -C "[email protected]"

之后将会在用户的主目录下,生成.ssh目录,目录下有id_rsaid_pub文件

  1. 登录GitHub

打开"Account settings","SSH Keys"页面,点击"Add SSH Key",填上任意Title,在Key文本框里粘贴id_rsa.pub文件中的内容:

github-addkey-1

4.2 添加远程仓库

目前,已经在本地有了一个Git仓库,可以在GitHub上再创建一个远程Git仓库,并且让这两个仓库远程同步。

  1. 登录GitHub,点击"Create a new repo",创建一个新的仓库:

github-create-repo-1

  1. 目前GitHub上的这个新建的仓库还是空的,可以通过从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到GitHub仓库:

在本地的learngit仓库下运行以下命令:

$ git remote add origin [email protected]:<username>/learngit.git  # 填上自己的用户名

远程仓库的名称默认就叫origin

  1. 把本地库的所有内容推送到远程库上:
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

把本地仓库的内容推送到远程仓库,是使用git push命令,实际上是把当前分支master推送到远程origin仓库

由于远程库是空的,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送给远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,之后推送时,只要本地作了提交,就可以通过命令git push origin master把本地master分支修改推送到远程GitHub仓库

4.3 删除远程库

若想删除远程库,可以使用git remote rm <name>命令,使用前建议使用git remote -v查看远程库信息:

$ git remote -v
origin  [email protected]:n1rv2na/learn-git.git (fetch)
origin  [email protected]:n1rv2na/learn-git.git (push)

之后可以根据仓库名来进行删除:

$ git remote rm origin

此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除!

4.4 克隆远程库

从零开发的最佳方式是先创建远程库,然后从远程库克隆:

首先登陆GitHub,然后通过4.2中的方式创建一个新的仓库;

然后使用命令git clone克隆一个远程库的本地库:

$ git clone [email protected]:n1rv2na/learngit1.git
# git@使用的是ssh克隆,Git支持多种协议,也可以使用HTTPS克隆
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.

5. 分支管理

5.1 Git分支管理原理

  • 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

image-20230619195107991

每次提交,master分支都会向前移动一步,随着开发者不断提交,master分支的线也越来越长。

  • 当创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

image-20230619195216980

  • 创建dev分支后,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

image-20230619195306868

  • 假如在dev上的工作完成了,就可以把dev合并到master上,Git合并就是把master直接指向dev的当前提交:

image-20230619195431164

  • 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,就剩下了一条master分支:

image-20230619195506669

5.2 新建分支

使用git branch -b <branch name>可以创建新的分支并且切换到该分支:

$ git branch -b dev
Switched to a new branch 'dev'

-b参数相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

可以使用git branch命令仓库当前分支:

$ git branch
* dev
  master

git branch命令会列出所有分支,当前分支前面会标一个*号。

5.3 分支合并

可以在新建的dev分支上正常提交:

$ echo "Creating a new branch named dev" >> README.md
$ git add README.md
$ git commit -m "branch test"
[dev b17d20e] branch test
 1 file changed, 1 insertion(+)

此时,切回master分支之后,将会发现刚刚对README.md做的修改不见了,因为那个提交是在dev分支上,而master分支此时的提交点并没有改变

可以使用git merge dev命令将dev分支上的工作合并到master分支上:

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支。合并后,再查看README.md的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

合并完成后,就可以删除dev分支了:

$ git branch -d dev
Deleted branch dev (was b17d20e).
$ git branch
* master
  • 切换分支

可以使用git checkout <branch name>命令切换分支,也可以使用git switch命令来切换分支:

创建并切换到新的dev分支,可以使用:

$ git switch -c dev

直接切换到已有的分支,可以使用:

$ git switch master

5.4 解决冲突

合并分支时,可能会遇到冲突的情况:

新建分支feature1:

$ git switch -c feature1
Switched to a new branch 'feature1'

修改

标签:md,教程,git,dev,Git,master,分支
From: https://www.cnblogs.com/N1rv2na/p/17542569.html

相关文章

  • 腾讯T3-3级资深架构师呕心整理:10万字节springboot教程全解!
    前言:可以毫不夸张地说,这篇文章介绍的SpringBoot教程基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个springboot的用法,文中都会都会有详细的教程解释。本文总共从29个章节,248页PDF,阐述springboot在各种环境下的各种用法,文中给大家列举出部分的springboot教程,需要这份10......
  • Zephyr入门教程 2 线程
    RTOS的必要性当你开始增加你的嵌入式应用的功能时,在单一的主循环和一些中断例程中做所有的事情变得越来越难。通常情况下,下一级的复杂性是某种状态机,你的电子设备的输出会根据这个(内部)状态而改变。如果你需要能够同时操作多个复杂的输入和输出呢?一个很好的例子是TCP/IP连接,通过这......
  • 第2章信息技术发展|软考高项信息系统项目管理师-教程伴读脑图
    第2章信息技术发展,一共30页的内容,篇幅中等,难度也是偏高(四颗星),毕竟相比第1章,增加了很多技术术语,对于非技术的同学可能会感觉更难一些。不过你真的没有必要针对技术打破砂锅问到底,你的目标是通过考试拿证,对拿证而言,技术不会考的深,而是会考的广,而且会紧扣教程中的原话,所以对于一些你经......
  • JSP环境搭建教程(保姆级!!)
    简介JavaServerPages(JSP)是一种由SunMicrosystems开发的用于创建动态网页的技术。它是JavaEE(JavaEnterpriseEdition)技术的一部分,允许开发者在HTML中嵌入Java代码,从而实现动态内容的生成。JSP主要由两部分组成:静态数据和JSP元素。静态数据可以是任何类型......
  • 技术讲解文字教程
    连接设备,将4G摄像头直接连接到电脑上。设置电脑网络,将电脑的网络设置为192.168.1网段。在浏览器中输入192.168.1.100,打开摄像头登录页面。使用用户名和密码"admin"登录。如果提示错误,可以查看摄像头上方的标签获取正确的用户名和密码。在高级设置-FTP设置中设置FTP服务器地址、......
  • 面试进阶齐飞!Github一天万赞的阿里Java系统性能优化有多牛?
    前两天在知乎上看到一个问答,说的是:一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?这个问题也引发了我的一些思考,可能很多人会说,“作为高级工程师,基础得过硬、得熟练掌握一门编程语言、至少看过一个优秀开源项目的源代码、有过高并发/性能优化的工作经验、沟通能力......
  • ZBrush 3D游戏建模教程:创建女武士模型
    推荐:将NSDT场景编辑器加入你的3D工具链3D工具集:NSDT简石数字孪生介绍 在本教程中,演示创建实时武士角色的流程,该流程基于 KatiSarinS 的原始概念。我将使用各种各样的软件,如ZBrush,Maya,SubstancePainter和Marmoset。在ZBrush,Maya和SubstancePainter中创建风格化的角色参......
  • 秘密扫描Gitleaks
    gitleaks是一个密码扫描工具,属于SAST扫描,可以协助我们扫描文件、代码仓中的密码、秘钥串类内容,实现安全左移https://github.com/gitleaks/gitleaks安装二进制命令基础安装后会发现产物大概10M大小gitclonehttps://github.com/gitleaks/gitleaks.gitgomodtidygobuild......
  • Fanuc发那科法兰克数控系统采集系列教程完整版(数据采集、网络配置、教程)
    Fanuc数控系统初探 FANUC是日本一家专门研究数控系统的公司,成立于1956年。是世界上最大的专业数控系统生产厂家,占据了全球70%的市场份额。FANUC于1959年首先推出了电液步进电机,在后来的若干年中逐步发展并完善了以硬件为主的开环数控系统。进入70年代,微电子技术、功率电子技......
  • 2023最新版本WebStrom安装教程【2023.1.3】
    前言本文方法可以安装使用截止当前2023.1.3最新版本WebStrom,过程非常简单,按照下面的步骤来一分钟即可搞定。1.下载安装已经安装过的可以跳过该步骤!下载到官网地址下载正版安装包JetBrainsWebStrom官网下载地址安装开始安装选择安装路径桌面快捷方式勾选创建妆......