Git
简介
Git是一个免费开源的分布式版本控制系统,它使用一个叫做仓库(Repository)的数据库来记录文件的变化,需要的时候可以很方便的将文件恢复到之前的某一个版本。同时,分布式的控制系统也可以很方便的将本地的项目同步给其他人。
新建仓库
创建仓库只需要把一个目录变成Git可以管理的仓库就可以了,一般来说,有两种创建仓库的方式:
-
git init
该方式可以直接把本地的一个目录变成仓库
wzh@DESKTOP-M633EU5 MINGW64 /e/github $ mkdir learn_git wzh@DESKTOP-M633EU5 MINGW64 /e/github $ cd learn_git/ wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git $ git init Initialized empty Git repository in E:/github/learn_git/.git/ wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master) $
可以看到提示符后面多了一个
(master)
也可以通过git init learn_git
完成这两步操作 -
git clone
该方式可以将远程服务器上的仓库克隆到本地
wzh@DESKTOP-M633EU5 MINGW64 /e/github $ git clone https://github.com/hetailang/SqueezeAttention.git Cloning into 'SqueezeAttention'... remote: Enumerating objects: 862, done. remote: Counting objects: 100% (157/157), done. remote: Compressing objects: 100% (104/104), done. remote: Total 862 (delta 44), reused 136 (delta 33), pack-reused 705 Receiving objects: 100% (862/862), 5.77 MiB | 383.00 KiB/s, done. Resolving deltas: 100% (184/184), done. wzh@DESKTOP-M633EU5 MINGW64 /e/github $ cd SqueezeAttention/ wzh@DESKTOP-M633EU5 MINGW64 /e/github/SqueezeAttention (main) $
工作区与文件状态
Git的本地数据管理分为三个区域:工作区,暂存区,本地仓库。
- 工作区:在资源管理器中看到的目录就是工作区
- 暂存区:临时存储区域,用来保存即将提交到Git仓库的修改内容
- 本地仓库:保存文件的所有历史版本
在工作区修改文件后,需要将修改的部分添加到暂存区,然后才能将文件提交到本地仓库。
关于暂存区,如果在工作区每修改一次都需要将文件提交到仓库会比较麻烦,所以可以将阶段性的修改都添加到暂存区一起提交。
Git中的文件分为以下四种状态:未跟踪,未修改,已修改,已暂存
添加和提交文件
git init # 新建仓库
git status # 查看仓库状态
git add # 将文件添加到暂存区
git commit # 将暂存区的文件提交到仓库
git log # 查看修改日志
在仓库中新创建一个文件,使用git status
查看其状态,可以看到文件的状态为未跟踪
wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master)
$ echo "first file" > file1.txt
wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master)
$ ls
file1.txt
wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master)
$ cat file1.txt
first file
wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
file1.txt
nothing added to commit but untracked files present (use "git add" to track)
使用git add
将该文件添加到暂存区,文件的状态将变为以暂存
wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master)
$ git add file1.txt
wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: file1.txt
使用git commit
将暂存区中的文件提交到仓库,注意该命令只会提交暂存区中的文件,不会提交工作区的其他文件
wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master)
$ git commit -m "first commit"
[master (root-commit) 271e6f4] first commit
1 file changed, 1 insertion(+)
create mode 100644 file1.txt
wzh@DESKTOP-M633EU5 MINGW64 /e/github/learn_git (master)
$ git status
On branch master
nothing to commit, working tree clean
git reset 回退版本
git reset --soft # 回退到某一版本,并保存工作区与暂存区的修改内容
git reset --hard # 回退到某一版本,并丢弃工作区域暂存区的修改内容
git reset --mixed # 回退到某一版本,并保留工作区的修改内容,丢弃暂存区的修改内容(默认)
git ls-files # 列出仓库中已跟踪的文件
“丢弃”可以理解为用仓库的状态覆盖目标区域的状态,但是这个操作不会影响到还未被跟踪的文件
删除文件
在git中删除文件有两种方法:
- 首先在本地工作目录删除,将文件拖到回收站或
rm <file>
- 将该删除操作同步到暂存区 :
git add <file>
- 提交 :
git commit
git为删除提供了一种简化的操作 : git rm <file>
,该操作可以同时删除工作区与暂存区的<file>
,然后再提交到仓库即可
错误将大文件上传到本地仓库,导致无法同步到远程仓库
远程仓库相比于本地仓库,对文件的大小有这更为严格的限制。一旦本地仓库里有上传大文件的提交记录,即使之后在将其从本地仓库删除,第一次上传大文件的记录也会被同步到远程仓库,导致同步失败。
这时,我们需要使用filter-branch
从所有的提交记录中删除有关大文件的记录。
filter-branch
是一个核弹级的选项,它可能会影响所有历史的提交记录
git filter-branch --tree-filter 'rm -f ./output/start.exe' HEAD
./output/start.exe
即为要删除大文件的名字,注意确保路径准确。执行成功后,应该得到Ref 'refs/heads/main' was rewritten
的结果。
之后在执行push
可能会遇到
fatal: refusing to merge unrelated histories
这是因为本地仓库与远程仓库的提交记录不一致导致的,我们使用
git pull origin main --allow-unrelated-histories
之后在处理冲突(如果有)即可。