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

  设置用户名和邮箱

git config --global user.name “Name_on_github”
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

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

git add [file1] [file2] ...
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, 那么可以简单的分别执行以下命令来解决(先把代码的本地修改保存起来,再从远程分支拉取代码,然后将代码的本地修改恢复):

git stash
git pull
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. 想要合并代码

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

git checkout feature
git merge main

  或者

git checkout feature
git rebase main

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lemon2050

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值