Git | 豆包MarsCode AI刷题

17 阅读4分钟

教程链接:简介 - Git教程 - 廖雪峰的官方网站

创建版本库

版本库又名仓库(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仓库

  1. 使用命令git add <file>,注意,可反复多次使用,添加多个文件;
  2. 使用命令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

时光机穿梭

  1. 版本回退

    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
    
  2. 工作区和暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

    工作区(Working Directory)

    就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

    版本库(Repository)

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
    把文件往Git版本库里添加的时候,是分两步执行的:第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

  3. 撤销修改

    场景1:当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。 git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,git reset --hard commit_id,前提是没有推送到远程库。

  4. 删除文件

    命令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
    

    如果一个文件已经被提交到版本库,那么永远不用担心误删,但是只能恢复文件到最新版本,会丢失最近一次提交后你修改的内容

  5. 远程仓库

    Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。第一步创建SSH Key:ssh-keygen -t rsa -C "youremail@example.com"。随后可以在用户主目录里找到.ssh目录,里面有id_rsaid_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。