文章目录
说明
本文为自学《Git 教程 by 廖雪峰》的个人整理笔记,仅用于知识点记录,方便回忆,无其他用途,原作者如有异议,请联系我将文章删除。
开始
- 安装Git一路next
- 新建文件夹 foldername
- 右键Git bash
备忘录
- 工作区:能看见操作的区域
- 版本库缓存区:都在
.git
文件夹中没事别去改它 - HEAD:指向maste,而不是指向分支,master指向分支,新建分支dev,dev和master未修改前指向同一地方,切换分支就是把HEAD指向master或者指向dev
新建本地仓库
git init//只在创建仓库时使用
//以下两行为配置本地仓库(文件夹内)全局变量,不配置这两个无法提交修改(本地与远程都不行)
git config --global user.name 'name'
git config --global user.email 'email@example.com'
更新本地仓库
说明:
- 可以编辑修改的内容为工作区
- 工作区----》缓存区----》本地仓库《----》远程仓库
- 缓存区内容未进入版本更迭不在时间轴上 ,所有提交会一个个串联起来
git add filename(-A)//可以把单个文件改动推入缓存也可以把所有改动推入缓存
git commit -m 'descrip' //为本次的修改提供一个描述
查看状态
如果有未提交的更改就会显示
git status
查看日志(回退过去)
按时间轴把保存列出来,最新的一定是HEAD,只能看见HEAD之前的,所以回退的同时记得把现在的id记下来,不然回不来。
git log
如果只查看最后一次提交信息
git log -1
查看操作记录(找到未来的版本)
回到过去后head指针就指向过去了,那时候的版本在这时看git log就是最新版本
git reflog
撤销修改(一键还原)
- 把工作区里的修改全撤销
- 撤销readme.txt中的修改会退到最近的最新版本或者暂存群里的。回退后head指向以前此时以前版本为最新区域
git checkout -- readme.txt
回退版本/撤销单个文件修改
git reset --hard HEAD (id/~/^)//回退版本
git reset HEAD filename//将暂存取得filename的改动回退到工作区
删除一个文件(慎用)
这个操作连同工作区的文件一起删掉(回收站也没找到这个文件)
git rm filename
但是可以用回退版本找到
下面的操作则不会删除本地文件或文件夹
git rm --cached <filename>
git rm -r --cached <foldername>
创建 SSH KEY
- 可以不设密码一路回车
ssh-keygen -t rsa -C "youremail@example.com"
最后会找到生成.ssh文件夹里面有id_rsa及id_rsa.pub两个文件分别为私钥和公钥
- github或者gitee上添加公钥:只有自己电脑公钥添加到了这些账号的ssh key 中才能同步
关联远程库
git添加 远程仓库(remote) 在本地命名为origin ,这个仓库的ssh地址为:git@github.com:user/learngit.git (首先要在网站上user这个用户下新建一个learngit仓库)
$ git remote add origin git@github.com:user/learngit.git
删除与远程库origin的链接
git remote rm origin
推送
推送到 origin 的master枝上,origin之前已经设置过地址
git push origin master
如果出现The authenticity of host 'github.com (52.74.223.119)' can't be established
是指github.com的真实性无法被确认,让你确认是否链接 输入yes
回车即可
-
git push
如果当前分支与多个主机存在追踪关系,那么这个时候-u选项会指定一个默认主机,这样后面就可以不加任何参数使用git push。 -
git push -u origin master
上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。 -
git push
,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。
创建分支/切换/合并删除
创建dev分支
git branch dev
切换dev 分支
git checkout dev
//注意与上文中撤销文件修改区别
(git checkout -- filename)
可以合并为一个命令 分支且切换
git checkout -b dev
查看分支情况:
git branch
分支合并
git merge branchname
但是分支修改了,主枝也修改了,并且修改的文件一样相同就会出现问题。
用下列指令查看流程图
git log --graph
-
使用
git status
查看冲突文件 -
修改冲突文件,再次提交,合并成功。
-
删除分支
git branch -d branchname
,强制删除使用git branch -D branchname
注意:合并冲突时 主线上提示符从 master
变成了 master|MERGING
处理完成后才会变回 master
删除分支后保留分支信息
- 通常,合并分⽀支时,如果可能,Git会⽤用“Fast forward”模式,但这种模式下,删除分⽀支 后,会丢掉分⽀支信息。
- 如果要强制禁⽤用“Fast forward”模式,Git就会在merge时⽣生成⼀一个新的commit,这 样,从分⽀支历史上就可以看出分⽀支信息。
git merge --no-ff -m "merge with no-ff" branchname
- 简约查看日志则可以将
git log --graph
拓展为git log --graph --pretty=oneline --abbrev-commit
分支使用概况图
各种分支使用
bug分支
软件开发中,bug就像家常便饭⼀一样。有了bug就需要修复。在Git中,由于分⽀支是如此的 强⼤大。
每个bug都可以通过
- 新的临时分⽀支
- 用新分支修复,
- 修复后合并分⽀支,
- 然后将临 时分⽀支删除。
Git还提供了⼀一个stash功能,可以把当前⼯工作现场“储藏”起来,等以后恢复现场后 继续⼯工作
git stash
这时候git status
时工作区就是干净的,
- 确认改bug分支,切换到这个分支再分支出去
- 修改完,提交合并删除
- 切换回之前储存的分支
- 查看stash里存储的现场
git stash list
之后有两种:
- 提取stash的现场,但是stash里还存在,需要手动删除
git stash apply
git stash drop
- 直接提取删除
git stash pop
feature分支
- 添加⼀一个新功能时,你肯定不希望因为⼀一些实验性质的代码,把主分⽀支搞乱了,所以,每添 加⼀一个新功能,好新建⼀一个feature分⽀支,在上⾯面开发,完成后,合并,后,删除该 feature分⽀支。
- 这个部分不需要没有特别只是编程习惯的提醒,如果要丢弃⼀一个没有被合并过的分⽀支,可以通过
git branch -D name
强⾏行删除
多人协助
查看远程库git remote
或者git remote -v
$ git remote -v
origin git@github.com:user/name.git (fetch)
origin git@github.com:user/name.git (push)
表示可以抓取和推送的网址。
推送
下面这句话的意思是向origin 推送本地 master分支
git push origin master
也可以推送dev分支
git push origin dev
但是,并不是⼀一定要把本地分⽀支往远程推送
- master分⽀支是主分⽀支,因此要时刻与远程同步;
- dev分⽀支是开发分⽀支,团队所有成员都需要在上⾯面⼯工作,所以也需要与远程同步;
- bug分⽀支只⽤用于在本地修复bug,就没必要推到远程了
- feature分⽀支是否推到远程,取决于是否合作在上⾯面开发。
抓取分支
- 原始克隆
git clone git@github.com:user/name.git
- 抓取分支
- 克隆下来只有master分支
- 克隆其他分支如下方所写:新建分支 参照远程库orgin下dev分支创建
$ git checkout -b dev origin/dev
Switched to a new branch 'dev'
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
- 双方推送相同分支出现冲突
- dev由a与b一起改写,a先推送了,这时候远程就和b本地之前的dev不符合就会拒绝远程库拒绝更新。
Updates were rejected because the remote contains work that you do
not have locally. This is usually caused by another repository pushing
to the same ref. You may want to first integrate the remote changes
(e.g., 'git pull ...') before pushing again.
See the 'Note about fast-forwards' in 'git push --help' for details.
- 使用
git pull( git pull <remote> <branch> )
拉取远程库,如果pull失败了是本地dev
没有与远程origin/dev
建立连接 - 没有链接,设置连接
$ git branch --set-upstream dev origin/dev
,再次下拉git pull
- 如果有冲突,如:
$ git pull
Auto-merging hello.py CONFLICT (content): Merge conflict in hello.py
Automatic merge failed; fix conflicts and then commit the result.
参照之前解决冲突后,git push
- 不是冲突,但是有新文件,就会要求你合并dev分支
Please enter a commit message to explain why this merge is necessary,
especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
这个和linux系统vi编辑文件一样
解决方法:
- 按 Esc按钮,退出编辑 输入
:wq
回车提交 - 编辑 按
i
键,输入提交信息 在按Esc 输入:wq
回车退出编辑 - 再次push
git push
标签管理
- 发布⼀一个版本时,我们通常先在版本库中打⼀一个标签
- 唯⼀一确定了打标签时刻的版 本。
- 取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。
操作步骤
- 查看分支
git branch
- 切换到想要分支
git checkout branchname
- 打标签
git tag <tagname(v1.0)>
- 查看标签
git tag
默认标签是打在新提交的commit上的。有时候,如果忘了打标签,找到历史提交的commit id 打上即可git tag <tagname> <commit id>
- 查看某个标签 git show
- 给tag标上说明文字
$ git tag -a <tagname> -m "version 0.1 released" <commit id>
删除标签
标签打错了删除本地标签git tag -d <tagname>
推送标签到远程
- 推送单个标签
git push origin <tagname>
- 推送全部标签
git push origin --tags
删除远程标签
git push origin :refs/tags/<tagname>
使用github
参与别人的项目
- fork(复刻)一份在自己的仓库再克隆到自己的电脑
- 修复bug,新增功能,往自己的仓库推送。
- 想原项目接受你的修改,发一个
pull request
,对方接受则可以合并。
自定义GIT
让UI显示颜色
$ git config --global color.ui true
忽略特殊文件
- 一些不得不放在文件夹,但是不能去追踪的文件,比如:存放密码的文档。
- 解决方法:建文件
.gitignore
里面的文件GIT会自动忽略,github上有许多配置好的文件模板可以下载 - 忽略原则:
- 忽略系统自动生成的文件
- 忽略中间可执行文件
- 敏感信息配置文件
- 举例(例子来自《Git 教程 by 廖雪峰》)
- 假设你在Windows下进⾏行Python开发,Windows会⾃自动在有图⽚片的⺫⽬目录下⽣生成隐藏的缩略 图⽂文件,如果有⾃自定义⺫⽬目录,⺫⽬目录下就会有Desktop.ini⽂文件,因此你需要忽略Windows⾃自 动⽣生成的垃圾⽂文件:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
- 然后,继续忽略Python编译产⽣生的.pyc、.pyo、dist等⽂文件或⺫⽬目录:
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
完整文件:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
ps:windows下不能新建.gitignore
文件会提示输入文件名,但是文档编辑器可以另存为这个文件
配置别名
- 将st 表示status
$ git config --global alias.st status
输入git st
可以表示git status
- 还可以配置短句指令
git config --global alias.unstage 'reset HEAD'
就可以使用git unstage test.py
表示$ git reset HEAD test.py
- 尝试丰富log可以产看的
$ git config --global alias.lg "log --color --graph -pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
结束
Git是为Linux源代码托管而研发的,可以使用Ubuntu
或Debian
系统的电脑,当然在windows
下肯定能用。