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