Github详细教程

文章目录

  • 一、参考教程汇总
  • 二、Git详细教程
    • 2.1 工作区/暂存区/版本库的概念
    • 2.2 Git创建仓库的两种方式
    • 2.3 Git删除仓库
    • 2.4 SSH Key的配置方法
  • 三、常用命令
    • 3.1 常用命令汇总
    • 3.2 Git分支管理
      • 3.2.1 创建/切换/删除/合并命令
      • 3.2.2 分支管理
      • 3.2.3 Rebase
    • 3.3 Git撤销修改
    • 3.4 Git删除文件
      • 3.4.1 git clean
      • 3.4.2 git rm
    • 3.5 Git版本回退
    • 3.6 Git标签管理
    • 3.7 git stash
    • 3.8 git add/git commit/git push区别
    • 3.9 git status和git log区别
  • 四、常见问题及解决方案
    • 4.1 本地和远程版本冲突
    • 4.2 本地分支和远程分支的链接关系没有创建

一、参考教程汇总

1.【重磅推荐】Git管理-廖雪峰
2.【重磅推荐】Git Bash使用详细教程(很详细,包括创建git,远程同步,回退版本,分支管理,解决冲突,隐藏现场修复bug等)
3.Git的使用–如何将本地项目上传到Github
4.git和github新手快速操作流程

二、Git详细教程

2.1 工作区/暂存区/版本库的概念

工作区(Working Directory):

  • 就是你在电脑里能看到的本地目录,

版本库(Repository):

  • 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

暂存区(Stage):

  • 把文件往Git版本库里添加的时候,是分两步执行的:
    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
  • 因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
  • 你可以简单理解为,需要提交的文件修改通通放到暂存区(git add),然后,一次性提交暂存区的所有修改(git commit)。

2.2 Git创建仓库的两种方式

为了实现github版本控制,需要创建仓库,有两种方法:

【第一种】(比较麻烦)

  1. git init 初始化本地仓库
  2. 把需要上传的文档复制到该文件夹下,可以通过git status查看当前repo状态
  3. 把该目录下所有文件添加到缓存区(git add .
  4. 把缓存区的项目提交到版本库(git commit -m "first commit")(需要输入用户名密码)
  5. 在Github上新建一个仓库,复制链接。
  6. 关联Github上的仓库和本地仓库 (git remote add origin https://github.com/aaon22357/test.git
  7. 把本地库的所有内容推送到远程repo上(git push -u origin master
    避坑指南:
    如果创建远程仓库的时候创建了README文件,那么在push的时候会报错:failed to push some refs to https://github.com/aaon22357/test.git
    解决方法:git pull --rebase origin master,之后再push就好啦。

git pull --rebase——(是一种冲突解决方式)用在合并代码的时候其作用就是在一个随机创建的分支上处理冲突,避免了直接污染原来的分区,如果有冲突, 解决冲突

git add .
不需要commit
git rebase --continue
git push 到远端

【第二种】(简单,推荐)
第一种做法要在本地和远端分别新建repo,然后remote连接,可能还需要处理冲突,比较麻烦,第二种方法就很简单了!

  1. 在github上创建空repo
  2. git clone 远程repo地址到本地
  3. 在本地repo中修改项目文件
  4. 将最新项目文件添加到本地暂存区(git add .
  5. 将暂存区文件提交到版本库(git commit
  6. 将版本库的文件push到远端repo(git push -u origin master

以下是【第二种】方法的具体步骤和实现细节:

第一步:在远程gitbub上创建一个repo

第二步:clone远程仓库到本地(有HTTPS和SSH两种clone方式)
git clone https://github.com/aaon22357/test_repo.git
https://github.com/aaon22357/test_repo.git是上面新建好的远程仓库地址

第三步:在本地仓库中修改项目文件

git status:查看本地仓库和暂存区的状态
git diff :查看file文件修改了什么内容

第四步:将最新的项目文件添加到本地暂存区,为commit做准备
git add .git add --allgit add

查看哪些改动将被提交 git diff --cached
如果不想将某个文件push到远程仓库,使用:git rm --cached 命令

第五步:将暂存区的文件提交到git本地仓库
git commit -m "my commit"

注意:

  • my first commit是对本次提交的说明,如果不加-m参数 ,git将调到一个文本编译器(通常是vim)来让你输入提交的描述信息
  • 如果没有新增(只有修改或删除),则可以使用git commit -a -m "my commit"将四五步合二为一
  • git commit --amend --no-edit 命令可以修改最近一次的提交说明(注释)【参考链接】

第六步:推送到远程github仓库
git push -u origin master (首次push要加参数 -u)

注意:

  • 如果git commit出现如下提示(// 需要输入用户名和密码)
    Github详细教程_第1张图片则需要配置一下邮箱和github用户名:
    git config --global user.email "[email protected]"
    git config --global user.name "aaon22357"
    之后再重新git commit即可。
  • 可以在本机配置,免输账号密码,配置方法见 【参考链接(Windows版)】
  • master表示主分支,也可以push到其他分支,将master参数替换成相应的分支名即可

2.3 Git删除仓库

删除本地仓库:rm -rf .git
删除远程仓库:github——打开需要删除的repo——Settings——一直往下拉,有个Delete this repository按钮——正确输入当前repo的名字——点击“I understand the consequences,delete this repository”按钮。

2.4 SSH Key的配置方法

前面提到,clone的时候有两种方式:SSH和HTTPS,两种方式的区别是:【参考】

  • HTTPS:使用https url克隆对初学者来说会比较方便,复制https url然后到git Bash里面直接用clone命令克隆到本地就好了,但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处(发现了https免密登录的方式)。
  • SSH:使用SSH url克隆需要在克隆之前先配置和添加好SSH key,因此,如果你想要使用SSH url克隆的话,你必须是这个项目的拥有者或管理员,否则你是无法添加SSH key的。另外ssh默认是每次fetch和push代码都不需要输入账号和密码,如果你想要每次都输入账号密码才能进行fetch和push也可以另外进行设置

生成ssh key的步骤:【参考链接,每一步有详细截图】

  1. 先看一下你C盘用户目录下有没有.ssh目录,有的话看下里面有没有id_rsa和id_rsa.pub这两个文件,有就跳到下一步,没有就通过下面命令创建
    $ ssh-keygen -t rsa -C "[email protected]"
    然后一路回车。这时你就会在用户下的.ssh目录里找到id_rsa和id_rsa.pub这两个文件。
  2. 登陆github,右上角图标——Settings——SSH and GPG KEYS——New SSH key——将刚刚生成的id_rsa.pub内容复制到Key内容框里——点击Add SSH key——完成。

三、常用命令

3.1 常用命令汇总

【查看类命令】

  • git log 查看git日志(或者git log --oneline 单行简单格式查看日志)
  • git log --graph 命令可以看到分支合并图
  • git log --graph --pretty=oneline --abbrev-commit (带参数)可以看到分支合并情况
    Git用(HEAD -> master)和(origin/master)标识出当前分支的HEAD和远程origin的位置,同理,branch分支的本地和远程状态,分别用(HEAD -> branch)和(origin/branch)标识。
  • git reflog 记录你的每一次命令
  • git status 查看当前所在分支状态
  • git diff 查看不同
  • git remote 查看远程库的信息
  • git remote -v 显示更详细的信息,显示抓取(fetch)和推送(push)的地址。如果没有push权限,就看不到push的地址。
git init 初始化仓库,在本地新建仓库会用到

git remote add origin https://github.com/username/project.git 关联一个远程仓库
或者 git remote add origin [email protected]:username/project.git(推荐)需要配置ssh

git add . 将文件加入暂存区
git commit -m "my commit" 将暂存区中文件提交到本地的版本库
git pull 拉取版本库最新数据到本地仓库
git push origin master  将本地仓库中新添加的文件上传到远程分支仓库
git push origin <branch> 将本地branch分支推送到远程仓库

3.2 Git分支管理

3.2.1 创建/切换/删除/合并命令

查看所有的分支和当前处于哪个分支:git branch
创建并切换到本地该分支:git checkout -b dev
创建本地仓库分支:git branch 分支名称
切换到本地某分支:git checkout 分支名称
合并指定分支到当前分支:git merge 分支名称
合并本地某分支到当前分支:git merge –no-ff -m “remark” 分支名称

删除本地仓库分支:git branch -d 分支名称
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。(-D参数表示强制删除)

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

3.2.2 分支管理

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。(来自廖雪峰)

3.2.3 Rebase

小结(来自廖雪峰)

rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

3.3 Git撤销修改

【第一种情形】 丢弃掉工作区的修改:git checkout --

这里又可以分为两种情况:

  • 一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态(还没有使用git add,只是在本地做了修改,撤销修改就是回到版本库的状态)
  • 一种是file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态(已经使用了git add添加到了暂存区,之后又在本地修改了,撤销修改就是撤回到暂存区的状态)
  • 总之,就是让这个文件回到最近一次git commit或git add时的状态。

【第二种情形】 撤回暂存区的修改: git reset HEAD

这种情形描述的是:修改完文件后,已经git add到缓存区了(但是还没有git commit到版本库),此时发现错误,想要把暂存区的修改撤销掉(unstage),重新放回工作区。需要两步:
git reset HEAD 将暂存区的修改撤销,放回工作区

注意:

  • git reset HEAD 如果后面什么都不跟的话,就是将暂存区里面的所有修改全部撤销
  • git reset HEAD ,仅对暂存区中的file文件进行撤销

git checkout -- 丢弃工作区的修改,回到最原始版本库的状态

【第三种情形】 撤回git commit: git reset --soft HEAD^
该操作适用于:已经git commit,只差push到远端repo这一步时,想要撤回commit操作的情况。这一步只会撤回commit这一步骤,不会修改代码。

3.4 Git删除文件

3.4.1 git clean

git clean的用法
git clean命令用来从工作区中删除所有没有tracked过的文件,git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以需要clean来删除没有track过的文件. 结合使用这两个命令能让你的工作目录完全回到一个指定的的状态。

查看哪些文件会被删除: git clean -n
删除当前目录下所有untracked files:git clean -f(不会删除.gitignore文件里面的东西)

3.4.2 git rm

git rm操作可以删除本地及版本库中的文件

删除github版本库中的file文件: git rm
删除文件夹需要加-r参数,git rm -r

git rm --cached 操作删除仓库中的文件,保留本地的文件

如果某个文件不想上传,可以从暂存区及版本库中移除,但是不会删除本地的文件,这个文件之后的修改也不会被跟踪(untracked状态):git rm --cached
对文件夹或文件路径操作,加-r参数:git rm -r --cached 文件夹或文件路径

3.5 Git版本回退

回退到上一个版本:git reset --hard HEAD^
往上回退100个版本:git reset --hard HEAD~100
撤销版本回退(回到未来):git reset --hard 1094a(未来版本的commit id)
本地版本回滚后,将本地的repo强制push到远程,即可实现远程版本回滚:git push origin master -f

版本回退总结(来自廖雪峰):
① HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
② 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
③ 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

3.6 Git标签管理

  • 打一个新标签:git tag (默认标签是打在最新提交的commit上的)
  • 查看所有标签:git tag
  • 给某个commit id打标签:git tag commit_id
  • 查看标签信息:git show
  • 删除某个本地标签:git tag -d (创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除)
  • 推送某个标签到远程,使用命令git push origin
  • 一次性推送全部尚未推送到远程的本地标签:git push origin --tags
  • 删除某个远程标签: git push origin :refs/tags/

【Attention】标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

3.7 git stash

git stash命令用于把当前工作现场“储藏”起来,等以后恢复现场后继续工作,在修复bug的时候比较常用。
git stash list查看隐藏的工作现场
git stash pop释放隐藏的工作现场

总结:

  • 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
  • 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
  • 在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

3.8 git add/git commit/git push区别

git add 命令会将文件加入暂存区,
git commit 会将暂存区中文件提交到git本地仓库,
git push 会将本地仓库中新添加的文件上传到远程分支仓库。

3.9 git status和git log区别

git status命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。git status不显示已经commit到项目历史中去的信息。看项目历史的信息要使用git log.

 

四、常见问题及解决方案

4.1 本地和远程版本冲突

Github详细教程_第2张图片原因:本地和远程版本不一致,所以push出错,解决方案有以下几种:
【方法1】强制push:git push -f origin master
这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。

【方法2】将远程仓库pull下来——手动解决冲突——重新push

  • 将远程仓库pull下来:git pull origin master
    系统提示:CONFLICT (content): Merge conflict in cnn-visualization.py Automatic merge failed; fix conflicts and then commit the result.说明有冲突
  • 打开冲突文件,手动合并冲突,然后重新git add,这里一般会出现master|MERGING提醒,网上的解决方案是执行git reset --hard head,其实这种方法是错的,这是撤销合并,不能随便撤销,得根据实际情况,要是一个小白看了,直接照敲进去,可能自己辛辛苦苦写的代码就没了。(一定要注意!)正确做法是:合并好所有冲突,然后git commit,不出意外的话,此时的MERGING提示已经消失了。
  • 最后一步,重新push:git push origin master

【方法3】新建分支——push到新分支——分支合并
若不想merge远程和本地修改,可以先创建新的分支:git branch [name]
然后将本地仓库push到新建的分支中:git push -u origin [name]

4.2 本地分支和远程分支的链接关系没有创建

在多分支管理时,

多人协作的工作模式通常是这样:

首先,可以试图用git push origin 推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

你可能感兴趣的:(Github详细教程)