You shall eat the fruit of the labor of your hands; you shall be blessed, and it shall be well with you.
在确定好了要学习使用git以及GitHub之后,我制定了如下的学习步骤:
- 学习< learn python the hard way > command line 教程
- 阅读git官方文档,观看官方视频介绍
- 学习廖雪峰的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"
-
git add
可以多次添加不同的文件到暂存区(stage) -
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
查看历史版本信息
工作区与暂存区
所以
git add
相当于:把文件修改添加到暂存区stage
git commit
相当于:把暂存区内所有的内容提交到当前分支(master)
简言之:需要提交的文件放在stage,然后用
commit
一次性全部提交stage的所有修改
管理修改
git是用来管理修改,不是管理文件的
所以
如果不add到stage,就不会被commit到master分支
git diff HEAD -- readme.txt
:查看commit后,working dict和版本库里面最新的版本之间的区别
git diff
是将working directory 与stage比较
git diff --cache
是将stage与master分支比较
补充:vi
命令(直接在bash里创建一个txt并写入内容)的使用
-
vi
进入界面 -
i
进入插入模式 - 写入内容
-
esc
退出插入模式,进入命令模式 -
:w a.txt
创建 a.txt并将写入的内容存放在a.txt内 -
:wq
保存并离开vi -
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_rsa
和id_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 git@github.com:fitzwong666/learngit.git
origin
是git默认的远程仓库的叫法
将本地库的内容推送到远程用
git push -u origin master
命令,实际上是把当前分支master推送到远程
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送时就可以直接用
git push origin master
推送最新修改
从远程仓库克隆
要从远程仓库克隆,要先知道地址,然后用git clone
进行克隆
eg:
git clone git@github.com/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 <branch name>
- 切换分支:
git checkout<branch name>
- 创建 + 切换分支:
git checkout -b <branch name>
- 合并某分支到当前分支:
git merge <branch name>
- 删除分支:
git branch d<branch name>
- 删除远程分支:
git push origin : <branch name>
(注意: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<name>
便可以新打一个标签
用git tag
可以查看所有的标签
一般打标签都是打在最新的commit上,如果忘了打的话,可以用git log --pretty=oneline --abbrev-commit
查到commit-id之后用git tag vo.9 123456
,然后用git tag
查看标签
git show<tag_name>
查看标签信息
git tag -a<tag_name> -m "abcdef..."
可以创建带有说明的tag
删除标签 git tag -d vo.1
因为创建的标签在本地,不会上传到远程
推送tag到远程 git push origin <tag_name>
一次性全部推送标签git push origin --tags
删除远程标签
- 第一步:
git tag -d<tag_name>
- 第二步:
git push origin : refs/tags/<tag_name>
常见问题整理:
- 遇到
》
符号说明没有输完ctrl + d
- 几种git add
-
git add a.txt
匹配到a.txt -
git add *.txt
匹配到当前目录下所有txt -
git add A/*.txt
匹配到当前目录和子目录下所有txt -
git add .
匹配到当前目录下所有文件
- 添加folder到repository
- git add <folder_name>
- git add folder_name/*
- git commit
- git push
- 删除repo中文件而不删除本地的
- remove folder/directory only from git repo and not from local
- step 1:
git rm -r --cached <file or folder name>
- step 2:
git commit -m"removed folder from repo"
- step 3:
git push origin <your git branch>
- step 1:
- remove folder/directory from repo & local
- step 1:
git rm -r <one of the directories>
- step 2:
git commit -m"removed folder from repo"
- step 3:
git push origin <your git branch>
- step 1: