git

1.定义

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

2.基本操作

Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit pull

img

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:本地仓库/版本库
  • remote repository:远程仓库

说明:

  1. repository就是一个仓库,里面存储的就是我们的项目代码、数据和文件;
  2. workspace就是你写代码的当前目录,你写代码、改代码都直接作用于上;
  3. staging area就是暂存区,你觉得你这个模块写完了,应该不会变了,就可以staging一下,相反,你觉得你写的代码有问题,可以从本地分支check out一下,就类似于ctrl+z到上一次commit;
  4. 当你实现了某一个功能,你可能就需要把所有的需要提交的文件编程staging的状态,然后提交到你本地的repository里面,也就是commit;
  5. 如果你发现你污染了工作区的某一个文件,且这个文件没有被你staging,那么你可以从local repository中checkout一下;
  6. 使用push将本地仓库代码push到远程,使用pull将远程仓库的代码更新至本地。

2.1克隆仓库

初始化 Git

1
git init

克隆默认分支代码

1
git clone https://github.com/angr/angr-doc.git

克隆 master 分支代码

1
git clone -b master http://gitslab.yiqing.com/declare/about.git

设置提交代码时的用户信息:

1
2
git config --global user.name "Sulawesi02"
git config --global user.email "18293411692@163.com"

查看分支

查看所有分支:

1
git branch

查看远程分支:

1
git branch -r

查看所有本地和远程分支:

1
git branch -a

合并分支

将其他分支合并到当前分支:

1
git merge [branch name]

例如,切换到 main 分支并合并 [branch name] 分支:

1
2
git checkout main
git merge [branch name]

2.2创建新分支

为了避免直接在 main 或 master 分支上进行开发,通常会创建并切换到一个新的分支:

1
2
3
4
5
6
7
# 本地创建新的分支
git branch [branch name]
# 切换到新的分支
git checkout [branch name]

# 创建并切换到新的分支
git checkout -b [branch name]

2.3暂存

将修改过的文件添加到暂存区,以便进行下一步的提交操作:

1
2
3
git add filename
# 或者添加所有修改的文件
git add .

2.4提交

将暂存区的更改提交到本地仓库,并添加提交信息:

1
git commit -m "first commit"

查看提交历史

1
git log

限制显示的提交数:

1
git log -n <number>

例如,显示最近的 5 次提交:

1
git log -n 5

显示自指定日期之后的提交:

1
git log --since="2024-01-01"

显示指定日期之前的提交:

1
git log --until="2024-07-01"

只显示某个作者的提交:

1
git log --author="Author Name"

恢复和回退

Git 提供了多种方式来恢复和回退到之前的版本,不同的命令适用于不同的场景和需求。

以下是几种常见的方法:

  • **git checkout**:切换分支或恢复文件到指定提交。
  • **git reset**:重置当前分支到指定提交(软重置、混合重置、硬重置)。
  • **git revert**:创建一个新的提交以撤销指定提交,不改变提交历史。
  • **git reflog**:查看历史操作记录,找回丢失的提交。

(1)git checkout:检查出特定版本的文件

git checkout 命令用于切换分支或恢复工作目录中的文件到指定的提交。

恢复工作目录中的文件到某个提交:

将 file.txt 恢复到 76eac54 提交时的版本:

1
git checkout 76eac54 -- file.txt #76eac54是当前要恢复的commit id

切换到 76eac54 提交提交时的版本:

1
git checkout 76eac54

这种方式切换到特定的提交时,处于分离头指针(detached HEAD)状态。

(2)git reset:重置当前分支到特定提交

git reset 命令可以更改当前分支的提交历史,它有三种主要模式:–soft、–mixed 和 –hard。

–soft:只重置 HEAD 到 76eac54 提交,保留暂存区更改。

1
git reset --soft 76eac54

–mixed(默认):重置 HEAD 到 76eac54 提交,取消暂存区更改。

1
git reset --mixed 76eac54

–hard:重置 HEAD 到 76eac54 提交,丢弃所有更改。

1
2
3
4
5
6
git reset --hard 76eac54 #76eac54是当前要恢复的commit id
git reset --hard head #当前版本
git reset --hard HEAD^ #回退到上一个版本
git reset --hard HEAD^^ #回退到上上一个版本
git reset --hard HEAD~3 #回退到往上3个版本
git reset --hard HEAD~10 #回退到往上10个版本

(3)git revert:撤销某次提交

git revert 命令创建一个新的提交,用来撤销指定的提交,它不会改变提交历史,适用于已经推送到远程仓库的提交。

撤销 76eac54 提交:

1
git revert 76eac54

(4)git reflog:查看历史操作记录

git reflog 命令记录了所有 HEAD 的移动。即使提交被删除或重置,也可以通过 reflog 找回。

1
git reflog

利用 reflog 可以找到之前的提交哈希,从而恢复到特定状态。例如:

1
git reset --hard HEAD@{3}

2.5推送

将本地的提交推送到远程仓库:

1
git push -u origin [branch name]

2.6拉取最新更改

在推送本地更改之前,最好从远程仓库拉取最新的更改,以避免冲突:

1
2
3
git pull origin main
# 或者如果在新的分支上工作
git pull origin [branch name]

为什么要先拉取?

Git要求在推送之前先拉取的原因是为了避免冲突。当多个开发人员同时修改同一个文件或代码时,可能会发生冲突。为了解决这种冲突,Git采用了合并(Merge)的方式。而在进行合并之前,我们需要先获取最新的更改。

假设有两个开发人员同时从远程仓库克隆了一个项目,并分别对同一文件进行了修改。如果其中一个开发人员直接推送自己的更改而不经过拉取过程,那么另一个开发人员在拉取最新更改后将会面临冲突。

使用示例来解释这个概念更容易理解。假设我们有两个开发人员A和B,他们共同在一个项目中工作。他们分别从远程仓库克隆了项目,并开始进行开发。

  1. A完成了对文件A的修改,并将更改推送到主线分支。
  2. 即使B将自己的更改推送到主线分支之前执行了拉取操作,B还是会得到一个合并冲突的错误提示,因为他的更改和A的更改发生冲突。

通过拉取最新更改,B将能检测到并解决冲突。这样,在合并的过程中就可以保持项目的一致性和完整性。

2.7删除分支

如果不再需要新功能分支,可以将其删除:

1
git branch -d [branch name]

强制删除未合并的分支:

1
git branch -D <branchname>

或者从远程仓库删除分支:

1
git push origin --delete [branch name]

3.Git 远程仓库(Github)

本例使用了 Github 作为远程仓库

由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:

使用以下命令生成 SSH Key:

1
ssh-keygen -t rsa -C "18293411692@163.com"

接着一路回车,直到结束。 会显示已经生成了.ssh的文件夹。在你的电脑中找到文件夹C:\Users\ useraccount /.ssh/id_rsa.pub,用记事本打开,复制全部内容。

打开自己的 Github 主页,点击右上角的头像,点击Settings。

img

点击SSH and GPG keys,然后点击New SSH keys。

img

img

找到SSH keys的设置选项,点击New SSH key 把id_rsa.pub里面的信息复制进去。

Title 可以随便起一个名字,Key 填写上一步复制的公钥内容,然后点击Add SSH key

最后执行下面的命令,测试一下 Git 参数是否配置成功。出现Hi username! You've successfully authenticated, but GitHub does not provide shell access.,说明配置成功。

1
ssh -T git@github.com

点New创建新的分支

img

点Create respository创建完成

img

本地仓库右键→显示更多选项→Open Git Bash Here

初始化 Git

1
git init

当前目录会出现一个.git文件

Pasted image 20240630002716

配置用户名和电子邮件地址

1
2
git config --global user.name "Sulawesi02"
git config --global user.email "18293411692@163.com"

img

1
2
3
4
5
6
7
8
9
10
11
12
13
git add .
git commit -m "commit"
git remote add origin https://github.com/Sulawesi02/llm.git
git push -u origin master


# 提交时如果仓库上已经存在 readme 或其他文件,可能会存在冲突

# 强制推送(舍弃线上的文件)
git push -f origin master

# 保留线上的 readme 文件,需要先执行
git pull origin master

网上的git教程有的用main分支举例,有的用master分支举例,原因在于,github建立远程仓库时的默认分支是main,实际上是通过倒数1、3行实现的,代码如下:

1
2
3
4
5
6
7
>echo "# Visualization" >> README.md
>git init
>git add README.md
>git commit -m "first commit"
>git branch -M main #创建新的分支main
>git remote add origin https://github.com/Sulawesi02/Visualization.git
>git push -u origin main #将新分支main推送到github

而建立本地仓库时的默认分支是master,所以两种分支其实区别不大,但我觉得提交master分支更顺手一点(提交main分支需要额外在本地创建并切换到main分支,别的区别不大)


git
https://sulawesi02.github.io/2024/08/19/2024-08-19-git/
作者
Sulawesi02
发布于
2024年8月19日
许可协议