快捷搜索:  汽车  科技

图解git 常用命令(Git常用命令)

图解git 常用命令(Git常用命令)Git commit -> 将暂存区的修改提交给本地仓库Git add -> 将工作区的代码修改添加到暂存区Git clone -> 克隆远程仓库到本地仓库Git pull -> 拉取远程仓库的分支,更新到本地仓库分支Git checkout -> 切换工作区的本地分支,或者用远程仓库的文件覆盖本地文件(即放弃对某个文件的修改)

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

图解git 常用命令(Git常用命令)(1)

​编辑

  • 远程仓库: 用于托管代码,该仓库通常位于远程服务器上,比如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 Key,Title可由用户自己决定,再把复制的公钥粘贴进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:

图解git 常用命令(Git常用命令)(2)

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

图解git 常用命令(Git常用命令)(3)

​编辑

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 常用命令(Git常用命令)(4)

​编辑

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。

猜您喜欢: