创建版本库
版本库又名仓库(Repository),可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建一个空目录learngit,通过git init
命令把这个目录变成Git可以管理的仓库
lys@LuyisongPC MINGW64 ~/learngit
$ git init
Initialized empty Git repository in C:/Users/lys/learngit/.git/
可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的。修改这个目录里面的文件会破坏Git仓库。接下来添加文件到Git仓库
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
lys@LuyisongPC MINGW64 ~/learngit (master)
$ git add readme.txt
lys@LuyisongPC MINGW64 ~/learngit (master)
$ git commit -m "wrote a readme file"
[master (root-commit) 55bde5f] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
时光机穿梭
-
版本回退
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
,或者用HEAD^、HEAD^^、HEAD~100来回溯上个版本、上上个版本、上100个版本。 穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。lys@LuyisongPC MINGW64 ~/learngit (master) $ git log commit 062ec112b60b8fc90cfd8b62568a8df628044404 (HEAD -> master) Author: Luyisong <1291022081@qq.com> Date: Thu Nov 28 22:17:56 2024 +0800 append GPL commit 55bde5f63195ac3a0275067c77f8055e19ea8887 Author: Luyisong <1291022081@qq.com> Date: Thu Nov 28 22:13:17 2024 +0800 wrote a readme file lys@LuyisongPC MINGW64 ~/learngit (master) $ git reset --hard HEAD^ HEAD is now at 55bde5f wrote a readme file lys@LuyisongPC MINGW64 ~/learngit (master) $ git log commit 55bde5f63195ac3a0275067c77f8055e19ea8887 (HEAD -> master) Author: Luyisong <1291022081@qq.com> Date: Thu Nov 28 22:13:17 2024 +0800 wrote a readme file lys@LuyisongPC MINGW64 ~/learngit (master) $ git reset --hard 062ec112 HEAD is now at 062ec11 append GPL lys@LuyisongPC MINGW64 ~/learngit (master) $ cat readme.txt Git is a distributed version control system. Git is free software distributed under the GPL. $ git reflog 062ec11 (HEAD -> master) HEAD@{0}: reset: moving to 062ec112 55bde5f HEAD@{1}: reset: moving to HEAD^ 062ec11 (HEAD -> master) HEAD@{2}: commit: append GPL 55bde5f HEAD@{3}: commit (initial): wrote a readme file
-
工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的
learngit
文件夹就是一个工作区: 工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。版本库(Repository)
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支
master
,以及指向master
的一个指针叫HEAD
。
把文件往Git版本库里添加的时候,是分两步执行的:第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。 -
撤销修改
场景1:当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,
git reset --hard commit_id
,前提是没有推送到远程库。 -
删除文件
命令
git rm
用于删除一个文件。 删除文件后,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了:- 一种情况是确实要从版本库中删除该文件,那就用命令
git rm
删掉,并且git commit
:
lys@LuyisongPC MINGW64 ~/learngit (master) $ rm text.txt lys@LuyisongPC MINGW64 ~/learngit (master) $ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: text.txt no changes added to commit (use "git add" and/or "git commit -a") lys@LuyisongPC MINGW64 ~/learngit (master) $ git rm text.txt rm 'text.txt' lys@LuyisongPC MINGW64 ~/learngit (master) $ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: text.txt lys@LuyisongPC MINGW64 ~/learngit (master) $ git commit -m "remove text.txt" [master bfec808] remove text.txt 1 file changed, 1 deletion(-) delete mode 100644 text.txt
- 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
如果一个文件已经被提交到版本库,那么永远不用担心误删,但是只能恢复文件到最新版本,会丢失最近一次提交后你修改的内容。
- 一种情况是确实要从版本库中删除该文件,那就用命令
-
远程仓库
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。第一步创建SSH Key:ssh-keygen -t rsa -C "youremail@example.com"。随后可以在用户主目录里找到
.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥。第二步在Github->Accounting settings->SSH Keys页面Add SSH Key在Key文本框粘贴公钥id_rsa.pub
文件的内容。为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许添加多个Key。假定有若干电脑,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。 添加远程库 已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以和他人通过该仓库来协作。点击Create a new repo创建仓库后,将一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。在本地的learngit
仓库下运行命令:git remote add origin git@github.com:chenxi0226/My_SourceDetection1.git
添加后,远程库的名字就是
origin
,这是Git默认的叫法。接下来把本地库的所有内容推送到远程仓库上。git push -u origin master
用
git push
命令,实际上是把当前分支master
推送到远程。由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。从现在起,只要本地作了提交,就可以通过命令:git push origin master
把本地master
分支的最新修改推送至GitHub。