git实用教程

Posted by 深度学习超度指南 on December 31, 2018

Git 实用教程

版本控制系统,linus大神,开源软件
开源乃编程之禅
优秀的程序员将更多的精力放在程序的设计上!
官方manual Git manual
git的所有操作是建立了commit之上的,只有commit之后才算做为真正的版本,本地目录的改动不被认可!!

初次使用Git前的配置

git config --global user.name '用户名'配置用户名
git config --global user.email '邮箱'配置邮箱
git config --list显示所有配置信息

1
2
git config user.name = "xxxx"
git config remote.origin.url="git@xxx"

命令行模式

A:Git记录的是什么?
Q:总而言之:
Git维护三棵树 *** Working Directory(Project):平时存放项目的地方
Stage(index):临时存放你的改动
Repository(Head):最终存放你数据

Remote(github):远程仓库,云仓库
***

  • git的工作流程
  • 在工作目录中添加、修改文件
  • 将需要进行版本管理的文件放入暂存区域
  • 将暂存区域的文件提交到Git仓库
  • Git管理文件有三种状态
  • 已修改(modified)
  • 已暂存(staged)
  • 已提交(committed) ***

实战

1.在电脑上面建立一个大本营(文件夹,存放自己的项目),终端输入
git init会在当前目录下自动创建一个隐藏的文件夹.git,它是用来跟踪管理版本迭代的,眼看手勿动

注意在终端运行要切换到当前目录,git init 是在终端当前路径下建立的

2.创建一个README.md文档,给使用者看,git add README.md,将文件放入暂存区域
3.git commit -m ‘add a readme file,将项目提交到仓库

git commit -m '你干了啥'每一次提交要写一个注释,这是提交你干了啥子 一旦将文件提交到git,就需要收到git的管理和跟踪,可能被git嘿嘿嘿

4.git clone [url]用于获取远程项目的copy到本地

MIT协议

MIT协议是非常宽松的,简单说来就是你可以随便使用我的程序

查看状态

看一下当前目录中文件的状态,哪些是新添加的,哪些是发生变化的,这个git status就像一个监视者,时刻关注着可以被git新来客户 ` git status `
》On branch master
nothing to commit,working directory clean
表示当前文件里没有需要提交的文件(针对当前文件都没有变化的),如果你此时在当前目录下添加一个新的文件License.txt后,再次执行
git status
就会出现提示
<use 'git add <file>'> to include in what will be committed
会提示是否有

增加/删除文件

git add [file or dir]将文件或者文件夹送入暂存区
git add .添加当前目录下所有文件到暂存区
git rm [file1] [file2]删除工作区和暂存区内的文件,也就是取消跟踪
git rm -f [file1] [file2]强制删除工作区和暂存区内的文件,如果对工作区和暂存区文件的内容不一致(发生了修改),使用普通rm会报错 git rm --cached [file]删除暂存区中的文件
git mv [file-previous] [file-renamed]改名文件,并将这个改名提交暂存区
在暂存区中成功添加文件后系统不会有提示,只有commit提交才会提示,成功添加到暂存区后,使用git status 查看文件会从由红色变为绿色,成功commit所有变化文件后在status中消失

注意:1.被commit成功的文件才会被追踪,一旦被git追踪后,文件的删除最好使用git指令进行删除,如果手动在文件目录下删除文件,这些动作并不会被git记录下来。同样的道理,一旦对文件使用了git,他就休想轻易逃出Git的魔掌
2.如果是个空文件夹,commit将不会被认可
3.git没有那么智能,如果随意更改其中一个被追踪的文件,会导致git以为删除了旧文件并且添加了一个新的文件,如果需要更改文件名字,要使用git mv指令,commit一下放到仓库中就好了。

提交和回到过去

git commit -m 'commit License.txt file'提交暂存区的所有文件到仓库区,-m [message]后面跟本次提交修改的信息
git commit [file1] [file2]提交暂存区指定文件到仓库区
或者给你一个反悔的机会
git reset HEAD~ 撤销上一次的操作,恢复到暂存区域Stage,HEAD是指向log的顶端,HEAD~便是上一次提交的
git reset HEAD~ [file]指定恢复的文件

git reset --mixed此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset --soft回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset --hard彻底回退到某个版本,本地的源码也会变为上一个版本的内容,此命令 慎用!


如果我们
git checkout .将暂存区的所有文件放入工作区,这一操作会导致本地目录文件被更改 git checkout --License将暂存区域的文件恢复到工作目录
*** ———-add—->….>–commit–>
working<——–>Stage<——–>Repository
<—-checkout—-<….<—-reset—-<…..

注意:直接使用git commit会弹出一个vim窗口,让你编写此次提交的说明,这个使用的就是vim的操作。

log提交日志

git log产看历史提交记录,地址使用了哈希校验和

1
2
3
commit 206f496b651439c2737a749e87cf30fb311d5077
Author: ellisonWangDD <1556905690@qq.com>
Date:   Wed Aug 15 13:23:01 2018 +0800

git show查看具体的变化

回到过去

HEAD(Repo)指向提交的最新的版本, git reset HEAD~[number]HEAD指向上number个快照
git reset --mixed HEAD~
git reset --soft HEAD~ 移动了HEAD的指向,没有发生实质性操作(改动工作区和暂存区),这个操作相当于不影响add,只是撤回了上一次的commit命令
git reset --hard HEAD~ 撤销上一个操作,直接影响文件目录(改动工作区和暂存区文件)

reset 回滚快照三部曲

1.移动HEAD的指向(–soft)
2.将快照回滚到暂存目录stage([–mixed],默认)
3.将暂存区域还原到工作目录(–hard)

指定回滚快照:git reset a5be0

回滚个别文件git reset 但是不会改变HEAD指针

区别命令

找茬命令,找到提交文件的区别
git -diff a/<暂存区域的文件> b/<工作区域的文件> 比较两个文件的区别

修改提交说明

git commit --amend -m '[new statement]'给上一次

Git分支

最傲娇的技能
克隆一个拥有一万个提交,5个分支的操作,增量文件系统,新的快照存放的是旧的快照不同的那部分,git会耗费更多的空间,但是在速度和效率上
git branch列出本地所有的分支
git branch [branch-name] #创建一个新的分支,但是仍停留在当前分支
git log --decorate查看详细的版本情况
git branch -d [branch-name]#删除一个分支
git checkout [branch-name] #切换分支,并且更新工作区和暂存区文件,同时把HEAD指向当前分支。
git push origin [branch-name]#将该分支推送到远程仓库

注意一下:

  • 使用git checkout命令的时候,他使用HEAD中的最新内容替换掉工作目录的文件,添加到暂存区的 改动和新 文件都不会受影响
  • 使用git branch 查看所有的分支,当前分支前面有个*号
  • 不论在哪个分支中,所有的提交记录都是共享的,使用git log查看的时候会发现所有分支的提交记录都在

git pullgit fetch后跟git merge FETCH_HEAD的缩写,更准确的说,git pull使用给定的参数运行,并调用git merge将检索到的分支合并到当前分支中

git分支合并

git merge 分支名称将<分支名称>合并到当前分支

对于文件级别的恢复,使用checkoutreset命令都可以恢复制定快照的指定文件,他们都不会改变HEAD指针的指向。 他们的区别是reset命令直降指定文件恢复到暂存区域,而checkout命令是同时覆盖暂存区域和工作目录,这样看来,在恢复文件方面,reset比checkout更安全一些。

Github远程同步

基本概念

  • 仓库Repository
  • 收藏star(100个star挺牛逼),方便下次查看
  • 复制克隆Fork分叉

    一个Repository对应一个开源项目

  • 发起请求Pull Request 发起请求,这个是基于Fork的。如果你在感觉别人的代码很好,可以fork到自己的从仓库中,你并且在他们的基础上做出了改进,你可以发起一个Pull Request请求给原主,如果他觉得的确可行,他就能够接受,你的改进就合并到原来的仓库中了。
  • 关注Watch 以后这个项目有任何更新,你都会收到
  • 事务卡片Issue,社交功能,发现程序的bug,与作者交流

  • git remote add origin 远程仓库的地址

    后面的链接是在github上面建立Repository后的仓库连接

  • git push -u orgin master提交这个分支到远程仓库

推送到github的demo

添加origin的地址,然后git push origin master即可

1
2
3
4
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:XXXXX/demo.git#此处使用的是ssh地址,ssh推送只能用于自己的仓库     
git push -u origin master#推送到master分支

在本地编写文件代码和提交,维护管理自己的文件版本自娱自乐,但这样意义不是很大,在这里介绍如何与其他的开发人员协同开发工作:每个开发人员都可以提交自己贡献的代码,并让其他人看到和修改。 要协同多人一起工作,可以通过修改操作代码将文件最后一个确定版本提交,然后推送变更。推送(push)操作将数据永久存储到Git仓库中,成功的推送操作后,其他开发人员可以看到新提交的变化。

git fetch <远程主机名> <分支名>将从远程仓库中取回所有的分支到本地仓库
git branch -r 可以查看远程所有分支,r是remote的意思 远程仓库分支名写法为origin/master git checkout -b newBranch orgin/master取回远程主机的更新后,可以使用git checkout创建一个新的分支

git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]] [--[no-]allow-unrelated-histories] [--[no-]rerere-autoupdate] [-m <msg>] [<commit>…​] git merge --abort git merge --continue
在取回远程的更新后,进行在本地分支上进行合并 git merge <branch>将分支branch合并到当前分支

  • git clone 仓库地址
  • git pull 更新本地仓库至最新改动, pull相当于是fetch+merge

  • 同步=pull+push,在很多的图形化版本控制中,e.g.:VS,Pycharm都有同步这个选项,同步之后会push到远程

    使用git clone url后,自动回创建一个名为origin的远端链接,指向Mary所fork的仓库

Note:同步根据commit的版本进行比对,如果本地和 如果本地和远程commit不一致(remote有本地不包含的commit),必须同步一次,本地仓库必须包含所有远程的commit,这样才能进行push,否则会失败,这也就是为什么需要先pull才能push的原因!!

pull的时候,会与本地合并commit,如果本地拥有所有remote的commit,pull的时候不有有任何改动

总而言之,本地仓库更重要,要求具备所有的commit

普通的reset只会造成暂存区的变更,使用checkout可以将暂存区中的内容释放到实际的工作路径

Pull Request

Pull Request是一种机制,它告诉所有参与者,他们需要审查提交的代码,并将代码并入master分支。 PullRequest不只是一个通知,还是一个专注于某个提议功能的讨论版。 Pull Request是如何工作的: Pull Request需要两个不同的分支或是两个不同的仓库, 1.开发者在他们的本地仓库中为某个功能创建一个专门的分支
2.开发者将分支推送到公共的Github仓库
3.开发者用Github发起一个Pull Request
4.其余团队成员审查代码,讨论并且作出修改
5.项目维护者将这个功能并入官方的仓库,然后关闭这个Pull Request

例子: Ellison是一位开发者,John是项目的维护者。John的仓库之一便是下面的官方项目。 为了参与到这个项目中,Ellison首先要做的是fork属于John的Github仓库,之后Ellison便在服务器端有了一个项目的副本。 接下来,Ellison需要将杠杆fork的Github仓库clone到本地开发

1
git clone url

在Ellison开发之前,需要新建一个新的分支,这个分支将是随后发起Pull Request时要用到的源分支

1
2
3
git checkout -b some-feature
git commit -m 'new feature'

Github Issues

  • 作用:发现diamanteBUG,但是目前没有成型代码,但是需要与作者进行交流
  • 使用方法:访问他人的Isuue,create an issue

Git速查表

sheet