携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
这是记录git版本控制工具的命令使用。
--help
当我们遇见不会的命令时,可以使用git --help,它会列出git的一些常用命令以及他们的作用。此外,它后面还可以加参数g或者a
- it help: 给出git概要和基本的git常用命令,
- git help -a 给出所有的可用命令,
- git help -g 给出有用的git指南,
- git help git 显示git手册。
config
我们第一次安装git后,需要配置git,告诉git我们的身份(我们是谁)。
一般就是配置用户名和邮箱:
git config --global user.name 'xxx'git config --global email 'xxxxxx'
我们也可以删除某个配置:
git config --unset --global user.name,这就删除配置中的user.namegit config --unset --global email,这就删除了配置中的email
我们可以使用git config --list查看全局配置。
init
我们在让一个项目进行版本控制时,需要使用git init初始化。它会生成一个文件.git,以后git就会跟踪这个文件从而实现版本控制。
commit
项目提交。(只是跟踪了这些文件,还没有提交到远程分支)
一般提交的步骤是:
-
git status,显示我们所在的分支,同时会显示跟踪有没有需要提交的文件(也就是有没有更新的) -
git add,我们需要添加我们要提交的文件到暂存区中- 可以使用
git add .提交所有可以增加的文件(就是git status中提示的那些文件) - 可以单独添加文件
git add xxx
- 可以使用
-
再使用
git status,我们可以查看我即将要提交的文件有哪些 -
再使用
git commit -m '提交的信息',我们如果不使用-m,git就会默认打开一个文本编辑器让我们添加提交的信息。 -
可以使用
git log查看我们提交的记录。(会有提交的作者信息、时间、提交的信息)
当然,我们可以合并git add .和git commit,使用git commit -am '提交的信息'
diff
我们修改了文件后,我们想要查看我们修改了哪些内容,就需要使用git diff
git diff默认比较的是暂存区和文件目录的区别,如果暂存区没有,才会比较文件目录和已经提交的文件区别。
rm
删除已经跟踪的文件。(就是已提交后的文件)
当文件重命名后,比如之前我们有一个文件index.html,现在我们将他重命名为了home.html,然后现在我们使用git status,我们会发现它的提示是:删除了index.html文件,有一个新的home.html文件。(它不能只能识别这是同一个文件,只是名字变了)
所以我们就得先删除已提交的index.html文件,再提交home.html文件。
git rm index.htmlgit add home.htmlgit commit -m '把index.html重命名为了home.html'
rm操作对象只能是已经提交的,如果我们新创建一个文件,还没有commit,那么我们使用rm对其进行操作是无效的,它会提示 No such file or directory
如果是文件夹,需要使用git rm -rf 文件名
mv
使用mv我们可以直接重命名或者移动文件(文件夹)。
比如我们现在需要将之前的home.html改为index.html:
git mv home.html index.html,我们发现我们本地的文件名字改为了index.htmlgit commit -m 'xxx',记住:rm后一定要commit。
mv操作对象只能是已经提交的,如果我们新创建一个文件,还没有commit,那么我们使用mv对其进行操作是无效的,它会提示 not under version control(并不在git的版本控制范围之内)
此外我们还可以移动该文件:(已经有了html文件夹且提交过)
git mv index.html html/git commit -m 'xxxxx'
这样这个index.html文件就在html文件夹下面了。
head
我们可以使用git checkout HEAD来恢复文件。
假如我们使用git rm index.html删除了index.html这个文件,现在我们想恢复:
git checkout HEAD -- index.html,其中 HEAD表示最近的一次提交, -- 表示当前分支git commit -m '恢复了xxxx'
这就将index.html恢复到了最近的一次提交时的情况了。
但是如果我们使用rm删除了文件后,又提交了,那么我们最近的一次提交也是空的,也没有这个我们,那么我们就需要恢复到最近提交的上一次提交
git checkout HEAD^ -- index.html,^代表最近提交的上一次,^^代表最近提交的上两次……git commit -m '恢复了xxxxx'
此外,我们修改文件后,想恢复到修改之前,也可以使用这个。
revert
我们查看历史提交:
git log --oneline// 只查看有id号的一行
如果我们想恢复到某一次的提交,就可以使用revert:
git revert id号
reset
reset和revert的作用有些类似。它也是主要用于版本回退,但是它的参数不同,回退的作用也不同:
git reset --soft id号,它是回退到这个版本的commit之前,add之后。同时,我们commit后,会覆盖掉id号后面的提交。git reset --mixed id号,默认,它是回退到这个版本的add之前,我们需要先add,再commitgit reset --hard id号,他是回退到这个版本的commit之后
注意:reset之后,如果是--soft和--mixed后再commit,或者是--hard后,它是直接将head指针指向了那个id,在使用git log就只会显示到现在的id,同时再有新的改变,再commit就会从现在的id开始了。
而revert是不会移动head指针的,他只是会重新commit到之前的某一个版本,那个版本之后的还会保存下来,就是相当于执行了一次新的commit而已。
branch
git branch查看所有的分支git branch 新的分支名,可以创建一个新的分支git branch -m 分支名 分支新名,可以修改分支的名字git branch -d 分支名,可以删除这个分支
checkout
如果我们需要升级版本,或者修改bug,但是不能影响之前的代码,一般就是新建一个分支。
新建分支后要移动到新建的分支上:
git branch new-mobile,新建了一个new-mobile分支git checkout new-mobile,现在我们就移动到了这个新的分支上面了
我们可以现在在这个分支上面修改了,而且不会改变其他分支:
新建了一个new.txt文件,内容为new:
git add new.txt,新建一个new.txt文件git commit -m 'new-mobile分支新建文件'git log --oneline --decorate,查看日志,我们发现当前head指针指向的是new-mobile分支上面的新提交的
查看我们的文件:
现在我们返回主分支:master
git checkout master,返回了主分支git log --oneline --decorate,查看日志
我们再查看我们的文件夹:
我们发现它回到主分支之前的状态了,也就是新分支并不会影响我们的主分支。
diff查看分支的区别
我们可以使用diff查看两个分支之间的区别:
git diff master..new-mobile,
也可以查看两个分支之间的某个文件的区别:
git diff master..new-mobile new.txt
merge
我们想合并两个分支,就可以使用git merge。假如我们想把new-mobile分支合并到master分支上:
-
查看当前的分支:
git branch,如果不是master分支,就得先切换到主分支 -
git merge new-mobile,合并分支
注:merge合并不会产生新的日志,但是他会将合并的分支的日志内容加到合并到之后的分支上面
git log --oneline --decorare
git log --oneline --decorare只显示当前分支,我们可以添加--all查看所有分支的历史提交
git log --oneline --decorate --all -10 --graph查看10条,所有分支的历史提交
conflict解决合并冲突
我们在合并后,在master分支上面修改了new.txt,在上面新增了master字段,并提交。然后再new-mobile分支上面也修改了new.txt,在上面也新增了mobile字段,并提交。然后合并,这时就会遇到一个合并冲突的问题:
合并:
我们可以打开new.txt文件:
- 要解决此问题,可以使用手动的方式:留下我们想要的内容,删除冲突的内容
- 然后提交:
git add .,git commit,可以不用加-m,git会自动给我们加消息
合并成功!
ignore
忽略文件,告诉git,我们忽略这个文件,不会这个文件进行跟踪,那么以后我们哪怕修改这个文件,git也不会管它。
git config --global core.excludesfile ~/.gitignore_globalvi ~/.gitignore_global。输入文件名。以后就会自动忽略这个文件。ls -la*,查看以.开头的文件
remote
我们之前所作的,都是基于本地的,并没有推送到远程仓库中,这样其实并没有达到协同工作的效果。
我们想推送到远程仓库,就得先连接远程仓库:(以gitee仓库为例)
git remote add origin https://gitee.com/iuyan/git-lesson.git
可以使用git remote -v查看连接情况
push
我们可以使用push将本地的分支推送到远程仓库中:
git push -u origin master,输入用户名和密码,然后会代码文件。
查看本地和远程的分支:
git branch -a # 查看本地所有分支
git branch -r # 查看远程分支
将其他某分支推送上去:
git push -u origin 某分支,-u的目的是可以远程跟踪这个origin/master 分支
push的顺序:
cd 目标目录
git checkout master # 切换到主分支
# 修改文件……
git commit -am '修改了某文件' # 提交
git push -u origin master # 把提交推送到远程
clone
我们想将别人仓库的代码下载到我们本地电脑上,除了可以使用github或者gitee上自带的download外,还可以使用clone克隆到本地
git clone https://xxxx.git (目标目录),如果不加目标目录就会创建和地址仓库上一样的目录结构。(克隆会克隆所有的东西,包括log日志,因为clone时会将那个.git文件克隆下来)
fetch
假如我们克隆了别人仓库的代码,然后那个仓库的作者又更新了该仓库,我们如何获得最新的版本呢?那就是使用fetch拉取更新。
git fetch
git status,查看状态- 会提示远程库上有更新。需要合并分支:
git merge origin/master git status,提示保持一致了。
fork
我们觉得别人仓库里的代码很好,自己想基于此,进行二次开发。那么我们就需要将这个代码拿到,然后再自己git init再创建远程仓库,再push吗?其实不用那么麻烦,只需要使用fork就可以了。
我们点击这个Fork,就会把这个代码库复制一份到自己的账户下。
再把自己账户下的这个库克隆到自己本地进行开发。
git clone https://xxx.git (目标目录)
cd 到该目标目录。 可以在该项目下配置git:
git config user.name 'xx'
git config user.email '某某@qq.com'
添加readme.md:
vi README.md
git add .
git commit -m '添加了README.md 文件'
git push origin master
打开自己的版本库,可以看到最后一次更新来自他自己。
总结一下我们使用git命令来第一次push代码的步骤:
git init
git add .
git commit -m '说明'
git remote add origin https://xxx.git
git push -u origin main
当然,现实生活中我们一般都很少使用命令,一般都是只用使用编辑器上的git版本控制插件,或者是使用git的GUI图形界面。但是掌握命令还是有必要的,因为这才是原理呀!
完结