Git 快速入门

Git 基本操作

讲师的博客:https://www.cnblogs.com/alex3714/articles/5930846.html
基本操作看之前自学的时候记的笔记:http://blog.51cto.com/steed/2138687
Git的官方文档(有中文):https://git-scm.com/book/zh/v2

回滚到上一个版本

用下面的命令,可以方便的回滚到前一次的提交:

$ git reset --hard HEAD^
HEAD is now at 2db6c31 首次提交,开始叫Git

HEAD就是当前版本的位置,加上一个尖号(‘^’)就是向前一个版本。如果是向前2个版本就是2个尖号。

查看信息

回滚之后再查看log的话,只会有当前版本之前的log。这时可以用git reflog命令:

$ git log
commit 2db6c315f98fd11ef43d5114a071dca88dda238d (HEAD -> master)
Author: 骑士救兵 <[email protected]>
Date:   Thu Sep 20 15:01:45 2018 +0800

    首次提交,开始叫Git

$ git reflog
2db6c31 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
90a5288 HEAD@{1}: commit: 第二次提交,增加了哪几期参加了git这节课
2db6c31 (HEAD -> master) HEAD@{2}: commit (initial): 首次提交,开始叫Git

回滚到指定版本

这里不用checkout,继续用上面的reset。这次把最后的HEAD^参数替换成对应的版本的md5值,只要reflog里显示的前几位就好了:

$ git reset --hard 90a5288
HEAD is now at 90a5288 第二次提交,增加了哪几期参加了git这节课

撤销修改

修改过文件后,要先add,然后commit就提交到本地仓库了。在commit之前是可以撤销之前的修改的(不留痕迹)。如果commit过了,就会在仓库中留下痕迹了,就无法真正的撤销了。

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   "\350\257\276\347\250\213\346\227\245\346\234\237.txt"

在add之后,使用git status,根据提示的命令操作,git reset HEAD &lt;file&gt;

$ git reset HEAD 课程日期.txt
Unstaged changes after reset:
M       课程日期.txt

然后再用git status确认状态:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   "\350\257\276\347\250\213\346\227\245\346\234\237.txt"

no changes added to commit (use "git add" and/or "git commit -a")

上面的操作就是add的反向操作,把文件从索引拿回工作区。但是文件的内容还是之前修改后的内容,此时当然可以手动到文件里去做修改,不过根据提示使用 git checkout -- &lt;file&gt; ,就可以撤销文件里修改内容:

$ git checkout -- 课程日期.txt

这里成功没有任何提示信息。
现在就把之前的修改完全撤销了,并且不留痕迹。

删除文件

从版本中删除一个文件,要如何add呢。可以把文件删掉,然后用提交所有的方法:

$ git add .

如果要指定文件名,就不能用add了,可以用rm:

$ git rm test.txt
rm 'test.txt'

命令执行后,也会同事把文件从系统中删除。
之后还是执行一次 git commit 提交当前的版本。

远程仓库

首先登录你的远程仓库,Github或者Gitee,创建一个项目。

创建项目

创建项目要填好项目名称,然后第一次用,一定要把README的那个选项去掉,否则提交之后不会出现提交远程仓库的帮助信息:
Git 快速入门

连接远程仓库

根据提示,先用 git remote 连接到远程仓库:

$ git remote add origin https://gitee.com/<用户名>/GitPro.git

成功的话没有提示信息,告诉你的本地仓库,给远程仓库提交的时候就往这个地址提交。
这时可以用git remote 查看已经添加的远程仓库信息,-v可以看详细:

$ git remote
origin

$ git remote -v
origin  https://gitee.com/XXXXXX/GitPro.git (fetch)
origin  https://gitee.com/XXXXXX/GitPro.git (push)

提交代码

向远程仓库提交代码就用这句命令:git push origin master
现在可以提交代码到远程仓库了:

$ git push -u origin master
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (10/10), 1.57 KiB | 267.00 KiB/s, done.
Total 10 (delta 2), reused 0 (delta 0)
remote: Powered by Gitee.com
To https://gitee.com/XXXXXX/GitPro.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

从现有仓库克隆

如果本地还没有仓库,那么就要先去远程仓库克隆一份到本地。克隆拉取到的是整个项目完整的所有历史数据:

$ git clone git://github.com/schacon/grit.git

默认就是在本地创建项目名称的同名文件夹了,也可以自定义项目名称,把名称放在命令后面再多一个参数:

$ git clone git://github.com/schacon/grit.git mygrit

拉取远程仓库的代码

下载代码,是下载当前分支的代码。所以如果有多个分支,先确认切换到了你要的分支:

$ git pull

命令很简单,什么参数也没有,就是把你当前的分支的远程仓库的代码拉下来。

分支管理

略了,上次记录的笔记里有。

查看分支合并情况

还用用查看提交历史的命令 git log ,加上--graph 选项,可以形象地展示了每个提交所在的分支及其分化衍合情况:

$ git log --graph

上面的命令的结果会很长,结果就不贴出来了。还可以加参数来优化,看起来更加清晰,就是每个版本的详细信息少了。

$ git log --graph --pretty=oneline
*   8ea95936cfe5c50c6113a56b31f73bb251b17105 (HEAD -> master) Merge branch 'alpha'
|\
| * fc9e77cd8b2cc2c5426c646d35d3609dc1c48675 (alpha) alpha 分支第一次提交
* | 8f25b065e21b85502f1b3a28dacd526b5d1b55ae alpha分支建立之后,切到主分支创建了mast_alpha文件
|/
* 0166a4b396b0874555cd8a9ff40ef58f9120d281 之前提交的版本貌似文件没有内容
* 959b03d0b8da43f7052fc3fd26172467067eef37 新加一个gitee.txt文件
* 929eeaab31f374acda4e346b229bf801c76f6a98 删除test.txt文件
* bfcaf896defd978b3a6d119c31cb48abaa70aefe 先提交一个test.txt,测试删除文件
* 90a52887600925e02577306510d8b7c22b1af01d 第二次提交,增加了哪几期参加了git这节课
* 2db6c315f98fd11ef43d5114a071dca88dda238d 首次提交,开始叫Git

这个命令貌似更常用,内容也更加精简:

$ git log --graph --oneline
*   8ea9593 (HEAD -> master) Merge branch 'alpha'
|\
| * fc9e77c (alpha) alpha 分支第一次提交
* | 8f25b06 alpha分支建立之后,切到主分支创建了mast_alpha文件
|/
* 0166a4b 之前提交的版本貌似文件没有内容
* 959b03d 新加一个gitee.txt文件
* 929eeaa 删除test.txt文件
* bfcaf89 先提交一个test.txt,测试删除文件
* 90a5288 第二次提交,增加了哪几期参加了git这节课
* 2db6c31 首次提交,开始叫Git

上面的参数 --oneline,实际上是这两个参数的简化用法 --pretty=oneline --abbrev-commit 。

储藏(git stash)

当你的代码写到一半的时候,此时来了一个Bug,需要你立刻处理。处理Bug的话,你需要新开一个Bug分支,先在这个分支上修改代码。但是此时,你不能直接切换分支,否则会把你未完成的代码带到新开的Bug分支里去。一个做法是,先提交到一个新的分支,然后回到之前的主分支上,然后再开Bug分支。不过你可能甚至不想提交你尚未完成的代码,此时可以用 git statsh ,先存储你的修改。

暂存修改

我此时正在开发一个beta版,已经做了一些修改:

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        beta.txt

nothing added to commit but untracked files present (use "git add" to track)

上面查看状态,工作区有新的未提交的内容。此时Bug来了,我要新开一个Bug分支,但是在那之前,得先有一个干净的工作区。这里用git stash来存储:

$ git stash
No local changes to save

这里显示并没有任何变化要存储,所以并没有把工作区的修改存储起来。用git status查看,工作区仍然有之前未完成的修改内容。这里需要先 git add 添加到索引区,然后再存储:

$ git add .

$ git stash
Saved working directory and index state WIP on master: 8ea9593 Merge branch 'alpha'

完整的命令应该是 git stash save ,这里save可以省掉。
此时再检查状态,工作区已经干净了:

$ git status
On branch master
nothing to commit, working tree clean

去看看文件内容,之前修改到一半的内容也都没了。不过之后还能再拿回来

假装做了Bug修复

现在有一个干净的工作区了,可以开一个处理故障的新分支了:

$ git checkout -b bug-101
Switched to a new branch 'bug-101'

然后随便做些修改,假设就修复了Bug:

$ git add .
$ git commit -m "hotfix-101"
[bug-101 6fb73d5] hotfix-101
 1 file changed, 2 insertions(+), 1 deletion(-)

上面修复之后,已经没问题了,就和master分支进行合并:

$ git checkout master
Switched to branch 'master'

$ git merge bug-101
Updating 8ea9593..6fb73d5
Fast-forward
 alpha.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

$ git branch -d bug-101
Deleted branch bug-101 (was 6fb73d5).

$ git branch
  alpha
* master

合并之后,顺手把那个bug分支也删掉了。

继续之前的工作

Bug处理完了,现在可以继续之前的做了一半的工作了,先看一下之前暂存的信息:

$ git stash list
stash@{0}: WIP on master: 8ea9593 Merge branch 'alpha'

取回暂存的内容:

$ git stash apply
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   beta.txt

清理暂存的数据

虽然已经那会了之前修改了一半的内容,但是你这个暂存的版本在git里还是保留着的。可以再用 git stash list 查看确认。此时可以用下面的命令进行清理:

$ git stash drop
Dropped refs/stash@{0} (0b8311f47144c409729e197578afab0e43153b1f)

再次都要一步删除的操作也很麻烦,可以用pop,在恢复的同时删除:

$ git stash pop

多次stash

如果进行过多次的stash,那么就会有多个版本。上面的命令应该是默认恢复到最近的,当然可以指定恢复到某一个。先用list查看所有暂存的版本,然后指定恢复到其中的一个:

$ git stash list
stash@{0}: WIP on master: 8ea9593 Merge branch 'alpha'
stash@{1}: WIP on master: 8ea9593 Merge branch 'alpha'
stash@{2}: WIP on master: 8ea9593 Merge branch 'alpha'

$ git stash apply stash@{1}

忽略特殊文件

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们。这时候可以配置一个特殊的.gitignore文件。
忽略文件的原则是:

  • 忽略操作系统自动生成的文件,比如缩略图等
  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件
  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件

依然很烦,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。
这里是python的:https://github.com/github/gitignore/blob/master/Python.gitignore

最后把.gitignore文件也提交到Git就可以了,位置就放在你项目的更目录下面。既然你的.gitignore文件也在git里面,自然也能给这个文件做版本管理。

全局的忽略文件

另外还可以写一个全局忽略的文件列表,然后把你文件的路径写到你全局的配置文件里:

git config --global core.excludesfile ~/.gitignore

你可以用下面的命令,查看你全局的配置文件的内容:

$ git config --global core.excludesfile
~/.gitignore

顺便你还可以用这些命令,查看你的各种配置:

$ git config --system --list
$ git config --global --list
$ git config --local --list
$ git config --list

强制添加

如果文件被忽略了,在用 git status 查看状态的时候,就不会看到这个文件了。但是如果这个文件又需要被提交,但是不想去修改配置,可以用下面的命令,强制添加原本被忽略的文件:

$ git status
On branch master
nothing to commit, working tree clean

$ git add -f .idea

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   ignor.txt

因为我做了配置,忽略ignor.*的文件,所以该文件在检查状态的时候被忽略了。然后将这个文件进行强制添加,这里如果不带-f参数,只是指定文件名的话,是会提示错误,提示你加上-f参数。加上-f参数就可以完成add,然后commit和之前是一样的。

检查忽略规则

检查在你的规则中,具体是哪一条把文件忽略了:

$ git check-ignore -v ignor.txt
.gitignore:4:ignor.*    ignor.txt

这个方法可以帮你找出来,自己的规则哪里写错了。

Pull Request

这个主要是在给别人的项目贡献代码的时候要用到的,大概也没啥机会会用到,随便记下步骤好了。
首先要fork这个项目,这是在你没有项目的push权限的情况下,贡献代码的另外一种方式。请求仓库拥有者拉自己的代码,所以不需要有仓库的权限。
fork之后,就可以在自己的账号下看到这个项目了。一定要从自己的账号下clone仓库,因为你改了之后无法提交到别人的项目里去(没有push权限)。
修改之后,就是给仓库的拥有者发pull request,最后由对方决定是不是要用你的代码。
小结,大致就是下面的步骤:

  • 在GitHub上,可以任意Fork开源仓库
  • 自己拥有Fork后的仓库的读写权限
  • 可以推送pull request给官方仓库来贡献代码。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章