git_learn

文章目录

引用

廖雪峰的git教程
git 官网

本地仓库基本使用

添加文件

git add file_name

同一个文件两次add,那么入库的时候,会入库最新一次add。

推入仓库

git commit -m "remark"

-m 参数是写版本备注。就像java语言注释一样,java注释告诉这段代码发生了什么。 -m以及后面的文字告诉这次版本更新发生了什么。

掌握仓库当前状态

git status

可以查看有哪些文件修改了还没有提交。

查看文件改变的内容

git diff file_name

查看版本日志

git log

git版本

git使用HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上个版本,如果版本太多,想表示上100次版本,使用HEAD~100表示。

git reset --hard HEAD^

有两个版本,旧版本是A,新版本是B。

如果回退版本到A。那么使用git log就没有版本B的信息了。

那么如何前进到B版本呢,只要还知道B版本的*[commit id](# commit id)* 就可以通过git reset --hard commit id

一般commit id可以写前几个进行模糊查询呢,但是尽量多写,防止冲突。

寻找commid id

  1. 查看git bash控制台历史记录。
  2. 使用git reflog查看命令历史记录。

工作区文件回退

什么是工作区

文件A之前已经入库了,目前正在修改,还没有add。但是想回到修改之前的状态,也就是最后一次入库的状态。使用git checkout -- file_name可以回退到该文件最后一次入库的版本。

一定不要忘记 – 两个短横线,不然就成了另外一个命令

如果此时A已经add进暂存区了,怎么办?使用git reset HEAD file_name将暂存区的文件撤销掉。

撤销掉之后git status告诉文件已经更改了,使用git checkout – file_name回退就当修改无事发生了。

如果已经入库了,那么只好使用git reset回退版本了,不过前提是没有被推到远程仓库。

删除文件

在文件管理器中删除或者使用rm file_name删除,但是git知道删除了啥文件。git status会告示你删除了啥文件。

  1. 确定这个文件是无用文件,就是需要删除的。 使用git rm file_name将文件从仓库里删除(同时文件资源管理器里的也会被删除),这个时候git status依旧会告诉你什么文件被删除了,可以继续通过*git commit -m “remark”*来确定这次修改。
  2. 如果此时反悔了,git status也告诉你什么文件被删了,使用上面的git checkout – file_name来恢复文件就万事大吉了。

commit id

版本号

git每一次更新版本都会生成一个很长的16进制数,也就是commit id。也就是版本号,只不过git防止版本号冲突,所以没有采取版本1,版本2这种格式。

远程仓库

准备工作

  1. 首先注册一个github账号

  2. 在git Bash中输入cd ~/.ssh检查是否生成了key,没有的话就找不到这个文件。

    1. 没有ssh文件的话,输入ssh-keygen -t rsa -C "邮箱地址".建议邮箱地址和github注册的邮箱地址一样。
    2. 然后一直回车。
  3. 进入.ssh文件,找到id_rsa.pub

  4. id_rsa.pub所有的内容添加到github的SSH Key设置里面。

  5. 检查是否设置成功,在gitBash中输入ssh -T git@github.com,会要求你输入密码,没设置密码的话,等一下就是的了。第一次可能会弹出一个警告,让你输入yes或者no,输入yes就可以了。注意,不要在git中直接输入yes,会造成gitBash死循环。

    可能出现的警告 输入yes就可以了,这个警告只出现一次。我的理解为第一次通过ssh进行数据交互的信任警告。

    The authenticity of host ‘github.com (xx.xx.xx.xx)’ can’t be established.
    RSA key fingerprint is xx.xx.xx.xx.xx.
    Are you sure you want to continue connecting (yes/no)?

    引自 廖雪峰git教程

  6. 如果没有弹出步骤5的警告,会出现一句话*Hi (your name)! You’ve successfully authenticated, but GitHub does not provide shell access.*说明成功了。

将本地仓库推给远程仓库

在你的github中创建一个新的仓库,如果仅仅用于学习远程仓库的话,只需要设置一个仓库名就是的了。

关联远程仓库使用git remote add origin(本地自定义的远程仓库名称) git@github.com:(github的用户名)/test(远程仓库的名称).git

将本地仓库推到远程仓库(github中)git push -u origin(本地自定义的远程仓库名称) master

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

引自 廖雪峰的git教程

之后如果想继续将本地代码推给远程仓库,只需要git push origin(本地自定义的远程仓库名称) master

查看远程仓库

git remote -v

删除远程仓库的连接

git remote rm origin(本地自定义的远程仓库名称)

如果需要删除github上面的物理仓库,需要前往github删除。

克隆远程仓库

git clone git@github.com:(your github name)/test_clone(your repository).git

分支

关于分支的介绍

建议去看看廖雪峰写的分支介绍。有图,说的比较容易理解。

创建分支

git checkout -b dev

其中**-b**参数表示创建并切换,相当于git branch devgit checkout dev这两条命令的简化版。

*git checkout (分支名)*与git switch (分支名)都可以切换分支

查看当前分支

git branch
这个命令会列出所有的分支,并且会在当前分支前面标注一个 * 号。

合并分支

git merge dev
将dev分支修改的内容和master分支进行合并。

合并模式有Fast forward快速合并,如果是这种模式下删除分支,会丢失被删除的分支所有信息。

如果不想已快速合并模式合并分支的话,在merge合并时添加上--no-ff参数,表示禁用Fast forward模式。这会产生一个新的commit id所以最好写上*-m “remakr”*。

删除分支

git branch -d dev

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

引自 廖雪峰的git教程

分支冲突

两个分支修改同一个文件,git没办法自动合并时,会提示冲突,需要手动更改。

Auto-merging t2.txt
CONFLICT (content): Merge conflict in t2.txt
Automatic merge failed; fix conflicts and then commit the result.

点开文件会出现<<<<<<<=======>>>>>>>这样的提示,自己保留需要提交的分支内容再次入库就可以了。

git log --graph可以查看分支合并图。

使用分支修复bug

创建新的临时分支前,可以使用git stash存储当前的工作区(文件夹)。此时的git status就是干净的。

使用git stash list查看stash区,是数组。

git stash pop取出stash区内容,并删除stash区内容。

git stash apply取出stash区内容,但是不会删除stash区内容,需要git stash drop来删除stash区内容。

git stash apply stash@{0}可以取出指定的stash区内容。

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

强制丢弃一个没有被合并的分支

git branch -D (分支名)

将删除分支的 -d参数换为了大写的 -D参数

错误

Q:>fatal: not a git repository (or any of the parent directories): .git

A:>当前目录没有.git目录,也就是没有执行git init初始化,值得注意的是,在初始化之前检查一遍你当前的目录是否在你的理想目录。


Q:>git Bash控制台出现**(end)**,无法操作。

A:>按下键盘Q键恢复正常。

Q:>fatal: not a git repository (or any of the parent directories): .git

A:>当前目录没有.git目录,也就是没有执行git init初始化,值得注意的是,在初始化之前检查一遍你当前的目录是否在你的理想目录。


Q:>git Bash控制台出现**(end)**,无法操作。

A:>按下键盘Q键恢复正常。

上一篇:Python数据分析基础技术之scikit-learn(史上最全面)


下一篇:Foundation框架中的NSFileHandle二