共计 7402 个字符,预计需要花费 19 分钟才能阅读完成。
你的文件须要 git,常用命令
上一节次要介绍了
- git 是什么?
- git 能做什么?
- github 是什么?如何注册与简略应用
- git 的配置文件
- git 单用户与多用户的配置
- github page 的简略应用
好了,工具是有了,那么咱们就要理解如何应用它来进步咱们的效率,甚至解决工作中较常呈现的问题。
但但凡个程序员,必须要学会 git 的基本操作,无论是学生时代,还是工作职场,多多少少会点 git 的命令。
嗯,鄙人也是从学生时代正在缓缓逾越到工作中,从以前简略的 git push
与git pull
扩大更多其余罕用的命令,免得咱们在工作上遇到问题手足无措,甚至呈现抓狂懊恼的一幕。
不过,我极力推荐一个在线交互式 git 命令学习的网站:https://learngitbranching.js.org/
好了,多余的话也不再多说了,都在酒里 …
创立仓库
如果,咱们当初想要有一个这样的需要:本地的我的项目代码想上传到的近程仓库,该如何做?
咱们思考一下,本地仓库该如何和近程仓库关联呢?嗯,这是个问题呀
我做了一个这样的试验,我在桌面上创立了一个文件夹:git-test
文件夹中寄存了一个名为 README.md 的文件,而后终端输出一个 git init
的命令,这时候咱们 cd
到.git
目录找到 config 文件
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
email = xxx@gmail.com
name = Dreamcats
好,咱们接下来去 github 上创立一个仓库,如图:
对于如何创立仓库,这里临时就不说了咩
从图中能够看到
- 近程仓库名为:ss-test
- 如果是新我的项目,图中很显著教咱们如何做
echo "# ss-test" >> README.md # 给 README.md 文件写入# ss-test
git init # git init 初始化命令,你就了解为生成一堆为仓库服务的 git 信息
git add README.md # 这里在本地仓库批改的文件提交到本地暂存区
git commit -m "first commit" # 给本次所提交的文件,给个正文,了解为版本正文
git branch -M main # branch 意为分支,git 仓库的新性能,分支性能,为了协同,也为了不同版本
git remote add origin git@github.com:DreamCats/ss-test.git # 本地仓库关联到近程仓库的桥梁
git push -u origin main # 间接买通桥梁,开始上传
- 如果是已有 git init 的我的项目,图中也通知你如何操作
git remote add origin git@github.com:DreamCats/ss-test.git # 必须有的,和近程仓库关联
git branch -M main # 仓库必须有个分支,当然你能够抉择 master 分支
git push -u origin main # 推送操作
我呢,首先在终端输出git remote add origin git@github.com:DreamCats/ss-test.git
这个时候 config 文件呈现了变动,咱们瞧一瞧:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
[user]
email = xxx@gmail.com
name = Dreamcats
[remote "origin"]
url = git@github.com:DreamCats/ss-test.git
fetch = +refs/heads/*:refs/remotes/origin/*
多了 remote origin,意味着和近程仓库关联,然而咱们少了一个重要的环节,你尽管和近程仓库搭建了桥梁,然而仓库是有个分支的概念,恰好咱们少了一个环节,如果这个时候,你执行了
git add README.md
git commit -m ":tada: create init push"
终端通知你:
fatal: 以后分支 master 没有对应的上游分支。为推送以后分支并建设与近程上游的跟踪,应用
git push --set-upstream origin master
也就是说,你本地仓库的分支是 master,而近程仓库如果有很多分支,它不晓得你要将本地分支上传到近程仓库中的哪个分支,因而你还须要绑定一个分支
git push --set-upstream origin master
后果不言而喻:
↳ git push --set-upstream origin master 128 ↵ 00:12:21
枚举对象中: 3, 实现.
对象计数中: 100% (3/3), 实现.
写入对象中: 100% (3/3), 226 字节 | 226.00 KiB/s, 实现.
总共 3(差别 0),复用 0(差别 0),包复用 0
To github.com:DreamCats/ss-test.git
* [new branch] master -> master
分支 'master' 设置为跟踪来自 'origin' 的近程分支 'master'。
如图所示,咱们能看到 README 文件的信息,也能看到批改文件的正文,如果再认真一点,也能看到版本号,分支等信息。
这个时候,咱们再回头看看本地仓库中 .git
的 config 文件:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
[user]
email = xxx@gmail.com
name = Dreamcats
[remote "origin"]
url = git@github.com:DreamCats/ss-test.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
呈现了分支参数,意味着,咱们和近程仓库关联须要这么几个参数:user、remote、branch
当然,很多信息都在 .git
文件夹中,有趣味的童鞋,能够具体钻研一波,多说一句:学技术,得钻研才行 …
.
├── COMMIT_EDITMSG # 嘿嘿,commit 正文写错了,这里能够从新批改撒
├── HEAD
├── config # 本地仓库和近程仓库关联的入口信息
├── index
├── logs # 这个很重要,能够看到版本号和近程仓库版本号
│ ├── HEAD
│ └── refs
│ ├── heads
│ │ └── master
│ └── remotes
│ └── origin
│ └── master
└── refs # 这里具体记录你的本地仓库和近程仓库的信息
├── heads
│ └── master
├── remotes
│ └── origin
│ └── master
└── tags
18 directories, 27 files
从下面你能够相熟几个以下命令:
- git init
- git remote add origin xxx.git
- git add
- git commit -m
- git push –set-upstream origin xxx
上传已有仓库(分支)
如果,咱们当初有这么个需要,近程仓库曾经有了我的项目,咱们本地仓库想关联近程仓库,然而其余分支,比方 feat_test,那么该如何做
两种状况:
- 没有关联近程仓库,想关联近程仓库,并上传新的分支上,该如何做?
第一步该做什么?那必定是初始化
git init
近程仓库必定有 master 了,个别状况下,本地仓库不要默认 master,要创立一个新的分支,比方 feat_test
git checkout -b feat_test
or
# 新建我的项目,可间接 -m
git branch -m feat_test
# 输出过后,主动切换 feat_test 分支
接着,关联近程仓库了撒,
git remote add origin git@github.com:DreamCats/ss-test.git
目前,本地仓库分支 feat_test,天然近程仓库没有,所以必须执行上面这句话
# 留神
git add README.md
git commit -m ":tada: create init push"
git push --set-upstream origin feat_test
看后果
↳ git push --set-upstream origin feat_test 00:44:50
枚举对象中: 3, 实现.
对象计数中: 100% (3/3), 实现.
写入对象中: 100% (3/3), 225 字节 | 225.00 KiB/s, 实现.
总共 3(差别 0),复用 0(差别 0),包复用 0
remote:
remote: Create a pull request for 'feat_test' on GitHub by visiting:
remote: https://github.com/DreamCats/ss-test/pull/new/feat_test
remote:
To github.com:DreamCats/ss-test.git
* [new branch] feat_test -> feat_test
分支 'feat_test' 设置为跟踪来自 'origin' 的近程分支 'feat_test'。
- 你在已有的近程仓库并关联了分支,该如何做?
比方,你从 master 拉取了我的项目,目前本地仓库的分支是 master,或者是其余分支,那么接下来咱们该如何做
很简略,间接创立新分支
git checkout -b feat_test2
此时,我批改了 README.md 文件,将 test1
批改为test2
git add README.md
git commit -m ":tada: create init push"
git push --set-upstream origin feat_test2
看后果:
↳ git push --set-upstream origin feat_test2 128 ↵ 00:55:41
枚举对象中: 5, 实现.
对象计数中: 100% (5/5), 实现.
写入对象中: 100% (3/3), 254 字节 | 254.00 KiB/s, 实现.
总共 3(差别 0),复用 0(差别 0),包复用 0
remote:
remote: Create a pull request for 'feat_test2' on GitHub by visiting:
remote: https://github.com/DreamCats/ss-test/pull/new/feat_test2
remote:
To github.com:DreamCats/ss-test.git
* [new branch] feat_test2 -> feat_test2
分支 'feat_test2' 设置为跟踪来自 'origin' 的近程分支 'feat_test2'。
从以上你能够理解的命令:
- git checkount -b xxx
- git branch -m xxx
- git branch -a (查看近程所有分支)
我略微补充一些,如何拉取近程分支
拉取近程分支
- 当然你能够拉取 master 玩一玩
git clone git@github.com:DreamCats/ss-test.git
git checkout feat_test
后果:
↳ git checkout feat_test 01:03:45
分支 'feat_test' 设置为跟踪来自 'origin' 的近程分支 'feat_test'。切换到一个新分支 'feat_test'
↳ cat README.md 01:04:01
test1
当然,你也能够持续切换其余分支
git checkout feat_test2
后果
git checkout feat_test2 01:04:12
分支 'feat_test2' 设置为跟踪来自 'origin' 的近程分支 'feat_test2'。切换到一个新分支 'feat_test2'
cat README.md
test2
-
间接拉取近程分支
- 创立文件夹:xxx
- 进入 xxx 文件下,终端输出
git init
- 接着,建设近程仓库连贯:
git remote add origin git@xxxx.git
- 拉取近程分支到本地:
git fetch origin xxx(近程分支)
- 拉取近程文件到本地:
git pull origin xxx(近程分支)
- 完结
合并
- 合并 master
如果,你当初处于 feat_test2 分支上,你当初开发实现了,想要合并到 master 上,该如何操作?
首先,咱们须要切换到 master 分支,毕竟 merge xxx
的意思是将 xxx 合并到你当初所在的分支上,废话不多说
git checkout master
git merge feat_test2 --allow-unrelated-histories
留神:合并分支,可能会呈现:fatal: refusing to merge unrelated histories
,所以,在命令前面加个--allow-unrelated-histories
- 合并其余分支
git checkout feat_test
git merge feat_test2 --allow-unrelated-histories
留神:如果 git checkout feat_test
呈现问题,请拉取近程分支到本地仓库,git fetch origin feat_test
- master 合并笼罩分支(抵触),如何解决
那就缓缓解决呗,解决抵触再上传即可
留神:个别公司不会让你轻易 merge request…
小插曲:git rebase 和 git merge 的区别
从以上你能够学到的命令:
- git checkout xxx
- git merge xxx –allow-unrelated-histories
删除分支
咱们晓得仓库有本地和近程,那么在咱们删除分支,不仅要删本地,还要删近程,如何操作?
git branch -d feat_test # 本地
git push origin -d feat_test # 近程
从图上看,近程 feat_test 被删除了
从以上能够学到的命令:
- git branch -d xxx
- git push origin -d xxx
好了,创立,合并,删除,都讲完了,是不是轮到版本了?
文件回退
我敢保障,你真的遇到想让某个文件复原当一个版本,或者上上个版本,或者上上上上个版本 … 我在套娃?如同也不是
我做个试验,我当初在工程目录下创立一个 Hello.txt 文件,打算在这个文件中,做各种荒谬之事 …
↳ tree . 127 ↵ 16:20:09
.
├── hello.txt
└── README.md
0 directories, 2 files
hello 文件的内容
hello
我当初试一试git checkout Hello.txt
呈现了一个小小的谬误
error: pathspec 'hello.txt' did not match any file(s) known to git
从而能看进去,不让咱们撤销新增的文件撒,checkout 撤销的是批改的文件,要不然咱们玩一下,我疾速的提交一波哈,不慌,我发现,文章好长 …
你们看完真心不易,下次录个视频也挺不错的 …
git add hello.txt
git commit -m ":sparkles: hello.txt"
git push origin master
我持续在 hello.txt
文件下增加一行world
,而后咱们应用git checkout hello.txt
↳ git checkout hello.txt 16:34:28
Updated 1 path from the index
留神,这哥们可不能文件回退某个版本
再留神,如果你提交了 add,亦或者 commit 了,那么 checkout 没啥子成果,不信你试试,反正我试过了 … 嘻嘻嘻
从以上你能够学到的命令:
- git checkout xxx(某个文件,撤销批改)
- git checkout . (撤销所有批改的文件)
然而如果真的 add 了,或者 commit,想回退,咋整?
回退版本
- 批改,无 add,无 commit
git checkout xxx # 回到开始无批改的仓库
- 批改,有 add,无 commit
git restore --staged <file>... # 同上
or
git reset <file>... # 同上
- 批改,有 add,有 commit
git reset HEAD^ # 同上,然而,默认的形式 --mixed,已批改的代码不会被抛弃,能够持续配合 checkout,如果一步操作,更换参数 --hard
留神:阐明几个参数
- HEAD^ 的意思是上一个版本,也能够写成 HEAD^1,如果你进行了 2 次 commit,也能够写成 HEAD^2
- –mixed:不删除工作空间改变代码,撤销 commit,并且撤销
git add .
操作,留神:默认是带有这个参数的。 - –soft:不删除工作空间改变代码,撤销 commit,不撤销
git add .
- –hard:删除工作空间改变代码,撤销 commit,撤销
git add .
再留神:如果对某个文件回退到某个版本,能够抉择以下形式,你可能须要配合git log
一、git checkout ${commit} /path/to/file
二、git reset ${commit} /path/to/file
${commit} commit 是你从 git log 中找到某个版本的 hash 字符串
- 批改 commit 的正文
有时候,一不小心 commit 了,然而正文不是本人想要的,怎么办?
当然,你能够抉择git reset --soft HEAD^
不过,不须要那么麻烦,你能够抉择这样的形式:
git commit --amend # vi 编辑器...
log 日志
终端执行:
git log
嗯,公司 mac 上的 iterm2,透明度有点低 …
在这图上,你能看到很多信息
git reflog
很显然,记录我所有执行 git 命令的操作,可恶 …
小结
本文挺长了,不能再写了,要不然会被声讨的 …
我集体感觉算是比拟具体的解说了,若是在工作上再碰到其余罕用的命令,我出个文章(三)…
感激大家的观看 …
我要悄悄的走了 …
参考
- git rebase 和 git merge 的区别
- git checkout
- git merge