关于git:你的文件需要git常用命令二

1次阅读

共计 7402 个字符,预计需要花费 19 分钟才能阅读完成。

你的文件须要 git,常用命令

上一节次要介绍了

  1. git 是什么?
  2. git 能做什么?
  3. github 是什么?如何注册与简略应用
  4. git 的配置文件
  5. git 单用户与多用户的配置
  6. github page 的简略应用

好了,工具是有了,那么咱们就要理解如何应用它来进步咱们的效率,甚至解决工作中较常呈现的问题。

但但凡个程序员,必须要学会 git 的基本操作,无论是学生时代,还是工作职场,多多少少会点 git 的命令。

嗯,鄙人也是从学生时代正在缓缓逾越到工作中,从以前简略的 git pushgit 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 上创立一个仓库,如图:

对于如何创立仓库,这里临时就不说了咩

从图中能够看到

  1. 近程仓库名为:ss-test
  2. 如果是新我的项目,图中很显著教咱们如何做
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 # 间接买通桥梁,开始上传
  1. 如果是已有 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

从下面你能够相熟几个以下命令:

  1. git init
  2. git remote add origin xxx.git
  3. git add
  4. git commit -m
  5. git push –set-upstream origin xxx

上传已有仓库(分支)

如果,咱们当初有这么个需要,近程仓库曾经有了我的项目,咱们本地仓库想关联近程仓库,然而其余分支,比方 feat_test,那么该如何做

两种状况:

  1. 没有关联近程仓库,想关联近程仓库,并上传新的分支上,该如何做?

第一步该做什么?那必定是初始化

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'。

  1. 你在已有的近程仓库并关联了分支,该如何做?

比方,你从 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'。

从以上你能够理解的命令:

  1. git checkount -b xxx
  2. git branch -m xxx
  3. git branch -a (查看近程所有分支)

我略微补充一些,如何拉取近程分支

拉取近程分支

  1. 当然你能够拉取 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
  1. 间接拉取近程分支

    1. 创立文件夹:xxx
    2. 进入 xxx 文件下,终端输出git init
    3. 接着,建设近程仓库连贯:git remote add origin git@xxxx.git
    4. 拉取近程分支到本地:git fetch origin xxx(近程分支)
    5. 拉取近程文件到本地:git pull origin xxx(近程分支)
    6. 完结

合并

  1. 合并 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

  1. 合并其余分支
git checkout feat_test
git merge feat_test2 --allow-unrelated-histories

留神:如果 git checkout feat_test 呈现问题,请拉取近程分支到本地仓库,git fetch origin feat_test

  1. master 合并笼罩分支(抵触),如何解决

那就缓缓解决呗,解决抵触再上传即可

留神:个别公司不会让你轻易 merge request…

小插曲:git rebase 和 git merge 的区别

从以上你能够学到的命令:

  1. git checkout xxx
  2. git merge xxx –allow-unrelated-histories

删除分支

咱们晓得仓库有本地和近程,那么在咱们删除分支,不仅要删本地,还要删近程,如何操作?

git branch -d feat_test # 本地
git push origin -d feat_test # 近程

从图上看,近程 feat_test 被删除了

从以上能够学到的命令:

  1. git branch -d xxx
  2. 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 没啥子成果,不信你试试,反正我试过了 … 嘻嘻嘻

从以上你能够学到的命令:

  1. git checkout xxx(某个文件,撤销批改)
  2. git checkout . (撤销所有批改的文件)

然而如果真的 add 了,或者 commit,想回退,咋整?

回退版本

  1. 批改,无 add,无 commit
git checkout xxx # 回到开始无批改的仓库
  1. 批改,有 add,无 commit
git restore --staged <file>... # 同上
or
git reset <file>... # 同上
  1. 批改,有 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 字符串

  1. 批改 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
正文完
 0