• Git常用命令


    想要了解Git的工作流,首先得先来看下Git的四个区,姑且都称作为“区”吧。如下图所示:

    • 远程仓库: 用于托管代码,该仓库通常位于远程服务器上,比如GitHub。GIT对远程仓库里的所有代码的增删改查进行跟踪,以便在需要的时候可以追踪历史,或者还原到某个时刻。
    • 本地仓库: 区别于远程仓库,本地仓库位于开发者的电脑上,但同样具备远程仓库的大部分其他特性。
    • 工作区: 开发者本地电脑上存放项目代码的地方,通常开发者对于代码的修改就是发生在工作区。
    • 暂存区: 存放开发者对于代码的改动,事实是一个文件(.git/index),保存已经添加的需要提交的文件列表信息。

    我们再来看下图中涉及的工作流:

    Git fetch -> 同步远程仓库的分支到本地仓库的分支

    Git clone -> 克隆远程仓库到本地仓库

    Git pull -> 拉取远程仓库的分支,更新到本地仓库分支

    Git checkout -> 切换工作区的本地分支,或者用远程仓库的文件覆盖本地文件(即放弃对某个文件的修改)

    Git add -> 将工作区的代码修改添加到暂存区

    Git commit -> 将暂存区的修改提交给本地仓库

    Git push -> 将本地仓库分支的代码修改推送给远程仓库的分支

    理解了上图中的工作流,我们从一个用户的角度来过一些常用的场景。

    1. 想要在操作系统中安装GIT

    可以下载安装文件Git - Downloads

    或者Linux可以使用apt-get或yum进行安装,而MacOS可以使用brew install进行安装。 Git在不同的操作系统上有着不同的安装方式,就不一一赘述了。

    安装完成后,可在命令行执行git来确认是否安装成功。如果执行出错一般都是因为没有配置好环境变量的原因。

    2. 想要配置Git

      设置用户名和邮箱

    1. git config --global user.name “Name_on_github”
    2. git config --global user.email “Email_on_github”

      查看所有配置信息:

    git config --list

      本地生成SSH公钥:

    ssh-keygen -t rsa -C “Email_on_github”

     然后在GitHub配置SSH公钥:

       复制文件.ssh/id_rsa.pub的内容(不同的系统有不同的路径,而且.ssh是隐藏文件夹),然后打开浏览器,登录github账号,点击你的头像,选择"Settings",选择右边的"SSH and GPG Keys",选择New SSH KeyTitle可由用户自己决定,再把复制的公钥粘贴进Key里面,点击Add SSK key即完成。

    3. 想要克隆远程仓库到本地

    git clone git@github.com:JimJin2050/AdventOfCodePython.git

       上面的命令执行完成后,如果没有错误信息,那么在当前文件夹会生成一个和远程工程同名的文件夹'AdventOfCodePython', 进入该文件夹后,就可以执行其它Git命令了。

     cd AdventOfCodePython

    4. 想要创建和删除分支

        创建一个名为dev的本地分支(branch)

    git branch dev

        然后将工作区的分支切换成dev分支

    git checkout dev

      上面的操作可以用一行命令来完成:

    git checkout -b dev

       删除本地分支:

    git branch -d dev

       删除远程分支:   

    git branch -D dev

      在获取最新的代码后(git pull命令会在后面详解),我们就可以开始搬砖了。

    5. 想要将代码改动提交到暂存区

    通常来说,IDE都有图形用户界面来辅助我们添加改动的代码文件。而且在添加时,都可以显示文件的改动信息。浏览这些信息有助于防止不正确的提交。如果需要手动添加,那么就需要用到下面的命令。

    添加一个有代码修改的文件到暂存区:

    git add data/day18_input.txt

    添加多个文件或者文件夹到暂存区: 

    1. git add [file1] [file2] ...
    2. git add [dir]

    添加当前目录下的所有存在代码修改的文件到暂存区:

    git add .

     执行以下命令,可以查看文件是否已经被加入到暂存区:

    git status

    成功加入暂存区的文件会在“Changes to be committed“下方以绿色字体显示。

    6. 想要将暂存区的内容提交给本地仓库

      提交所有已经被添加到暂存区的代码文件:

    git commit -m ‘your_message’

       提交已经添加到暂存区的单个或者多个文件 :

    git commit [file1] [file2] ... -m [message]

      修改commit message:

    git commit --amend

      查看历史记录里的commit,在HEAD之前的所有commit信息都会被显示,其中包括commitID, author, date和commit message:

      

     7. 想要获取最新的代码

        每天在开始写代码之前,我们都希望可以获取远程仓库中最新的代码变动,这在规模大一些的团队中,或者是离岸团队中,显得至关重要。

        将特定远程分支中的代码拉取到本地,并且和本地的特定分支进行merge:

    git pull <远程主机名> <远程分支名>:<本地分支名>

        假定我们想要将远程分支main里的最新代码同步到本地分支dev中,那么具体的git 命令如下:

    git pull origin main:dev

        其中origin是远程主机的默认名,main是远程分支名,而dev是我们创建的本地分支名。通常来说,git pull = git fetch + git merge

        通常我们只需要执行git pull就行,git会按照默认的设置(git config --list可查看默认设置)将代码同步到当前分支。一般新创建的本地分支会要求我们指定远程主机名和远程分支名:

    git pull origin main

       或者配置当前分支的默认上游远程分支名(配置后,就可以直接执行git pull了):

    git branch --set-upstream-to=origin/main dev

       如果git pull时遇到代码冲突,需要仔细阅读错误/提示信息,如果提示信息建议使用git stash, 那么可以简单的分别执行以下命令来解决(先把代码的本地修改保存起来,再从远程分支拉取代码,然后将代码的本地修改恢复):

    1. git stash
    2. git pull
    3. git stash pop

       如果没有git stash的建议,那么就需要手动去处理冲突,其实就是对同一位置的远程代码块和本地代码块做出取舍。通常IDE会有图形用户界面辅助我们解决冲突。代码冲突必须要被解决,除非你不想使用最新的代码。  

    8. 想要将本地分支的代码改动推送给远程分支

       首先确保本地代码是最新的,可执行一次git pull。其次要确保代码修改已经提交给了本地分支(git add + git commit)。

       从特定本地分支推送至特定远程分支:

    git push <远程主机名> <本地分支名>:<远程分支名>

       不同:git pull是<远程分支名>:<本地分支名>, git push是<本地分支名>:<远程分支名>

       类似:  我们也可以直接执行git push, 当然必须已经具备了足够的默认设置。

    9. 想要放弃本地修改

       放弃工作区中的全部修改:

    git checkout .

       放弃工作区中某个文件的修改:

    git checkout -- filename

    10. 想要撤销当前的git add操作

      撤销所有git add操作:

    git reset HEAD

      撤销某个文件的git add操作:

    git reset HEAD filename

      

    11. 想要撤销当前的git commit操作

        撤销git commit,但是不删除工作区代码改动,并撤销git add:

    git reset --mixed HEAD^

        注意,如果没有添加reset的参数,那么git reset会默认使用--mixed

      撤销git commit,但是不删除工作区代码改动,并不撤销git add:

    git reset --soft HEAD^

        撤销git commit,但是删除工作区代码改动,并撤销git add:

    git reset --hard HEAD^

      这里我们有必要了解下HEAD了:

      首先我们看下本地文件.git/HEAD

      HEAD的内容显示,HEAD是当前分支的引用。我们可以理解为HEAD是一个指向当前分支的指针,而当前分支包含不定数量的commit, 而commit之间存在层级关系。

       HEAD -> 指向当前commit

       HEAD^ -> 指向当前commit的父亲commit,后面可以接数字,默认为HEAD^1

       HEAD~ -> 指向当前commit的前一个commit,后面可以接数字,默认为HEAD~1

      因为可能涉及多个分支的提交,而且提交也可以被撤销,所以HEAD^并不等同于HEAD~,这里就不作深入分析了(有点绕,费脑和费文字)。

      我们也可以直接将代码重置到某个commit, 只需要知道这个commit的ID皆可(通常可以通过git log 命令来获取特定的commit id):

    git reset --hard commit_id

     12. 想要恢复工作区的代码改动(已被git reset --hard HEAD^撤销)

        如果我们已经执行过git reset –-hard HEAD^命令,那么说明我们已经有过一次成功的commit,但是我们使用git reset --hard HEAD^撤销了这次commit,而因为使用了--hard, 所以连工作区的代码改动也被删除了。

        此时,我们执行git log命令已经获取不到已经被撤销的commit的id了,所以需要执行新的命令来获取我们需要的commit ID:

    git reflog

        

      git reflog会记录每一次操作后,当前分支所指向的commit ID的前7位,通过这个前7位commit ID,我们同样能够恢复所指向的特定commit的代码。

    git reset –hard 84b627c

    13. 想要合并代码

      把主分支合并到当前分支:

    1. git checkout feature
    2. git merge main

      或者

    1. git checkout feature
    2. git rebase main

    可根据实际情况,选择使用rebase和merge。

  • 相关阅读:
    软考 ----- UML设计与分析(下)
    算法基础学习|排序
    vue中动态设置source标签
    使用GH(命令行)在本地提出Github上的issue、PR,合并PR
    ChatGPT3.5使用体验
    SpringBoot整合Druid数据源
    ubuntu安装最新版本的go基于官网二进制
    在外包公司干了一年半软件测试的一些反思与总结
    运维审计是什么意思?有什么作用?用什么软件好?
    洛谷刷题笔记 集合运算1
  • 原文地址:https://blog.csdn.net/JZF2050/article/details/127436697