Learn「.git」

You shall eat the fruit of the labor of your hands; you shall be blessed, and it shall be well with you.

在确定好了要学习使用git以及GitHub之后,我制定了如下的学习步骤:

  1. 学习< learn python the hard way > command line 教程
  2. 阅读git官方文档,观看官方视频介绍
  3. 学习廖雪峰的git教程,将教程里面的代码逐行逐字在git bash中敲出来

以下笔记来源于廖雪峰的教程

Introduction

git - 版本控制工具 - version control

注意:版本控制,只针对文本文件(.txt)格式,图片,视频等二进制的不可以,word也是二进制,也不行

注意:windows下的记事本不能用,要用Notepad++

安装git bash后,输入如下两行配置用户名以及邮箱

git config --global user.name "your name"
git config --global user.email "your email"

注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址

创建版本库

版本库:Repository

选择一个directory,创建一个空目录作为git仓库

eg:

mkdir learngit
cd learngit
git init:将这个文件夹变为git仓库

添加文件到git 仓库

分两步:

git add readme.txt
git commit -m"description"

  1. git add可以多次添加不同的文件到暂存区(stage)
  2. git commit可以把所有暂存区内的多个文件一次性全部提交

不同版本间的切换

cat readme.txt用来将文件内容显示出来

git status用来得知当前工作区(working directory)的状态

git diff readme.txt查看修改的内容

注意: git diff要用在git add readme.txt之前

git log:显示从最近到最远的(commit)命令历史

如果嫌显示的太多了

可以用git log --pretty=oneline就只会显示一行commit id

版本回退

  • 退回上一版本
    • git reset --hard HEAD^
  • 退回上上本版
    • git reset --hard HEAD^^
  • 退回100个版本之前
    • git reset --hard HEAD~100

HEAD相当于一个指针,指向当前版本

git reset --hard commit_id 在历史版本之间穿梭

commit id使用前几位即可

git log用来查看提交历史
git reflog查看历史版本信息

Learn「.git」_第1张图片
reflog命令

工作区与暂存区

Learn「.git」_第2张图片
工作区与暂存区

所以

git add相当于:把文件修改添加到暂存区stage
git commit相当于:把暂存区内所有的内容提交到当前分支(master)

简言之:需要提交的文件放在stage,然后用commit一次性全部提交stage的所有修改

管理修改

git是用来管理修改,不是管理文件的

所以

如果不add到stage,就不会被commit到master分支

git diff HEAD -- readme.txt:查看commit后,working dict和版本库里面最新的版本之间的区别

Learn「.git」_第3张图片
git diff HEAD --

git diff是将working directory 与stage比较
git diff --cache是将stage与master分支比较


补充:vi命令(直接在bash里创建一个txt并写入内容)的使用

  1. vi进入界面
  2. i 进入插入模式
  3. 写入内容
  4. esc 退出插入模式,进入命令模式
  5. :w a.txt 创建 a.txt并将写入的内容存放在a.txt内
  6. :wq保存并离开vi
  7. q!强行退出vi

撤销修改

1). git checkout -- readme.txt ( -- 很重要)

可以应对如下两种情景

  • 如果在working directory 修改了readme.txt,但是还没有add到暂存区,那么就撤销至和版本库一样的状态
  • 如果在add到暂存区后修改了readme.txt,但是还没有commit,那么就撤销至刚刚add到暂存区的状态

2).如果修改了readme.txt并且add到了暂存区,那么用git reset HEAD readme.txt把暂存区里的重新放回到工作区,然后再使用git checkout -- readme.txt

3).如果commit了,但是同时commit的还有很多其他文件,那么使用git reset HEAD^把readme.txt放回暂存区,然后再提交或到工作区修改

删除文件

commit了文件test.txt之后,如果在工作区删除了test.txt

可以用git rm test.txt将版本库里的也删了

或者

git checkout test.txt撤销删除

远程仓库

github是一个为git提供远程托管服务的服务器

通过SSH来加密

ssh-keygen -t rsa -C"your email"

然后一直回车

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能公开,id_rsa.pub是公钥,可以公开

然后在github里 找setting - SSH Keys 把id_rsa.pub的内容黏贴进去。

GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

添加远程仓库

可以将本地的git仓库和远程github里的仓库同步,将本地的文件推送到远程

先在github里创建一个new repo 比如叫做learngit

注意:创建repository的时候不勾选Initialize this with a README ...

然后 在本地learngit 路径下,运行如下命令 建立 本地 < ---- >远程仓库之间的联系

输入:git remote add origin git@server-name:path/repo-name.git
例如:git remote add origin [email protected]:fitzwong666/learngit.git
origin是git默认的远程仓库的叫法

将本地库的内容推送到远程用

git push -u origin master命令,实际上是把当前分支master推送到远程

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

git push origin master推送最新修改

Learn「.git」_第4张图片
Learn「.git」_第5张图片

从远程仓库克隆

要从远程仓库克隆,要先知道地址,然后用git clone进行克隆

eg:

git clone [email protected]/fitzwong666/gitskills.git

git支持https,但是通过ssh支持的原生git 协议最快

创建与合并分支

master是主分支,大家都不要在上面直接动工,最好分支到自己的branch工作

HEAD指向当前分支

创建new分支,并切换到new分支

git checkout -b new

这个命令相当于两个命令合在一起,第一步git branch new,然后git checkout new

使用git branch可查看当前分支,在当前所在的分支前会显示*

在new分支上做完修改后,add ->commit

然后用git checkout master切回master主分支

在当前分支上用git merge new将new分支合并到当前分支

然后git branch -d new删除new分支

总结

  • 查看分支:git branch
  • 创建分支:git branch
  • 切换分支:git checkout
  • 创建 + 切换分支:git checkout -b
  • 合并某分支到当前分支:git merge
  • 删除分支:git branch d
  • 删除远程分支:git push origin : 注意:branch name前的空格不能少

解决冲突

在branch上改了并add commit
在master上改了并add commit
由于在这两个节点上都改了文件
所以
这时
merge会产生conflict,需要手动解决冲突(通常是删一个)后再add ——> commit
git log --graph 可以看到分支合并图
(git log --graph --pretty=oneline --abbrev-commit)显示缩略图

补1:
git log的各种变体:

补2:
有个文件夹A,在A中添加a.txt
git add A/*可以把文件夹和里面的文件批量提交,不用一个一个上传

补3:

  • git add -A (stages All)
  • git add . (stages new and modified, without deleted)
  • git add -u (stages modified and deleted, without new)

分支管理策略

Master分支是用来发布新版本,平时不在上面干活,主要在A上,每个人都有自己的分支,然后在A上合并

Bug分支

git stash弹到一个地方去处理bug

要在哪个分支(A)上修复bug,那么就在该分支上创建一个新分支来临时修复Bug

git checkout -b issue-01

修复后add -> commit

然后切回A分支,

并合并git merge --no-ff m"description" issue-01

修复完成

然后用git stash list看看自己在哪里,

  • git stash pop删除
    • 这一步也可以分为两步
      • git stash apply先恢复
      • 然后 git stash drop删除

多人协作

查看远程信息用 git remote -v

本地新建的分支如果不push到远程,对他人不可见的

从本地推送分支的方法:git push origin branch-name

若推送失败,是因为远程分支比本地分支更新一点,先解决冲突(通常是删一下)

要用git pull抓取远程的提交,在本地合并

如果被git bash提示说「no tracking information」

  • 若Pull失败,是因为没有设置本地分支a与远程origin/a的链接;需要先建立本地分支和远程分支的关联
    git branch --set-upstream branch-name origin/branch-name

在本地创建和远程分支对应的分支,用git checkout -b branch-name origin/branch-name

标签管理

tag打在版本库中,和commit是联系在一起的
先切换到需要打标签的分支上,然后git tag便可以新打一个标签
git tag可以查看所有的标签
一般打标签都是打在最新的commit上,如果忘了打的话,可以用git log --pretty=oneline --abbrev-commit查到commit-id之后用git tag vo.9 123456,然后用git tag查看标签
git show查看标签信息

git tag -a -m "abcdef..."可以创建带有说明的tag

删除标签 git tag -d vo.1

因为创建的标签在本地,不会上传到远程

推送tag到远程 git push origin
一次性全部推送标签git push origin --tags

删除远程标签

  • 第一步:git tag -d
  • 第二步:git push origin : refs/tags/

常见问题整理:

  1. 遇到符号说明没有输完 ctrl + d
  2. 几种git add
  • git add a.txt 匹配到a.txt
  • git add *.txt 匹配到当前目录下所有txt
  • git add A/*.txt 匹配到当前目录和子目录下所有txt
  • git add . 匹配到当前目录下所有文件
  1. 添加folder到repository
  • git add
  • git add folder_name/*
  • git commit
  • git push
  1. 删除repo中文件而不删除本地的
  • remove folder/directory only from git repo and not from local
    • step 1: git rm -r --cached
    • step 2: git commit -m"removed folder from repo"
    • step 3: git push origin
  • remove folder/directory from repo & local
    • step 1: git rm -r
    • step 2: git commit -m"removed folder from repo"
    • step 3: git push origin

你可能感兴趣的:(Learn「.git」)