一、初始化
本地版本控制、集中版本控制SVN、分布式版本控制
linux与git
下载:http://npm.taobao.org/mirrors/git-for-windows/
git config –global credential.helper store
创建用户
系统用户级别
git config –global –list
git config –-global user.name “mingyue”
git config –global user.email “284908631@qq.com”
信息保存文件 C:\Users\MingYue\.gitconfig
查看是否成功:
git config –list
如果最后出现的用户名和邮箱则为成功
项目级别
git config user.name “mingyue”
git config user.email “234234@qq.com“
信息保存文件 ./.git/config
idea使用git
setttings -> terminal -> shell Path git/bin/sh.exe
乱码:etc/bash.bashrc
添加
# support chinese
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
二、基本操作
提交
git status
获得工作区、暂存区状态
-s 简短输出
git add README.md
把README.md放入缓存区
git rm –cached good.txt
删除缓存区中的good.txt
git commit filename
git commit -am "commit all"
直接提交所有
提交缓冲区中的文件
-m ”add a README file” filename
把缓存区的README.me放入仓库,“双引号里的是注明”
git restore –staged fileName
暂存区取消
git checkout –orphan latest_branch
创建新分支,无提交记录
日志
git log
查看历史提交记录
–pretty=oneline 只显示一行
–oneline
多屏显示控制方式:空格向下翻页 b向上翻页 q退出
只能显示前面的版本
git reflog
有下标(步数)
reset
使用reflog查看哈希值
基于索引值
git reset –hard [局部索引值]
git reset –hard a2sf3d
使用^符号,只能后退
git reset –hard HEAD^
n个^后退n步
使用~符号,只能后退
git reset –hard HEAD~n
reset –soft 参数
- 仅在本地库移动HEAD指针
reset –mixed 参数
用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变
默认选项
在本地库移动HEAD指针
重置暂存区
$ git reset HEAD^ # 回退所有内容到上一个版本
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git reset 052e # 回退到指定版本
reset –hard 参数
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
删除文件并找回
前提
删除前已经存在本地库
操作
git reset –hard s23adf
恢复现指针
git reset –hard HEAD
比较文件差异
- git diff [文件名]
- 将工作区中的文件和暂存区做比较
- git diff [本地库中的历史版本HEAD^^^] [文件名]
- 将工作区中的文件和本地库历史做比较
- 不指定文件名,比较所有
分支管理
分支介绍
版本控制过程中,多条线同时推进多个任务
好处
同时并行推进多个功能开发,提高开发效率
各个分支互不影响
git branch
- [分支名] 创建分支
- -v 查看分支
- -r 远程分支
- -a 所有分支
- -d 删除分支
- -D 删除未合并
- -m old new 更名
git checkout
- [分支名] 切换分支
- -b name 创建并进入分支
- -b name template 以模板创建并进入分支
- git checkout -b dev(本地分支名) origin/dev(远程分支名)
如果分支A工作区和缓存区是干净的(即在A分支commit之后再没做任何更改),随便往别的分支跳都不会有影响。
如果在A分支下有未完成的工作,往B分支checkout的时候,会把A分支下的工作带过去
合并分支
git checkout [需要修改的分支名]
git merge [有新内容的分支名]
合并冲突
两个分支同时修改了同一个地方
git add
git commit -m “ “ 无文件名
other
git reset HEAD
把缓存的文件恢复原来的状态 最后一次提交到git仓库的文件恢复回暂存区域。
git checkout – LICENSE
将暂存区域的旧文件覆盖工作目录的文件
git reset–maxed HEAD~10
(–maxed默认)影响两棵树,将仓库的快照回退 到前10个版本
git reset –soft HEAD~
影响一棵树,移动HEAD的指向,指向上一个快照
git reset –hard HEAD~
影响三棵树,移动后的快照回滚到暂存区域,并还原到工作目录
删除所有.gitignore文件
find . -name “.gitignore” | xargs rm -Rf
git reset (版本快照)
git reset 版本快照 文件名/目录
对比:
暂存和工作:
git diff
三棵树:工作区域 暂存区域 git仓库
ll (.git/) //查看该目录下的文件
ls -lA //查看该目录下的所有文件
ls -l|less
mkdir WeChat //创建新目录
git init //初始化
cat .git/config //项目级别的
cat ~/.gitconfig //global
git status
vim good.txt
git rm –cached good.txt
:set nu//显示行号 i进入编辑 在第一行编辑完后 Esc :wq
克隆仓库
git clone https://www.baidu.com
忽略文件
find . -name “.gitignore” | xargs rm -Rf
三、Git基本原理
哈希
文件管理机制
快照
Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git的工作方式可以称之为快照流
分流
四、Github
remote
git remote -v
查看当前所有远程地址别名
git remote add [别名] [远程地址]
给地址取别名
操作
git push [别名] [分支名master]
git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名>
git clone [远程地址]
- 创建orgin远程地址别名
- 初始化本地库
- 下载到本地
git clone -b v1.0.1 https://github.com/named-data/mini-ndn/
-b表示取特定的分支,v1.0.1指定版本号,后面是github仓库的地址。
团队成员邀请
settings -> collaborators->Add collaborators
该地址用来接受
merge
git fetch [远程库地址别名] [远程分支名]
下载到本地
git checkout origin/master
切换到下载下来的分支
git merge [ ] [ ]
git pull [ ] [ ] 下载并合并
git pull <远程主机名> <远程分支名>:<本地分支名>
$ git pull origin Mingyue
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From gitee.com:mingyuefusu/test
* branch Mingyue -> FETCH_HEAD
db7f660..756e866 Mingyue -> origin/Mingyue
Auto-merging test1.md
CONFLICT (content): Merge conflict in test1.md
Automatic merge failed; fix conflicts and then commit the result.
#进行处理冲突
rebase
不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)
合并多个commit
# (startpoint, endpoint]
git rebase -i [startpoint] [endpoint]
# 合并3个提交
git rebase -i HEAD~3
# 放弃rebase
git rebase --abort
指令
pick: 保留该commit(缩写:p)
reword: 保留该commit,但我需要修改该commit的注释(缩写:r)
edit: 保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash: 将该commit和前一个commit合并(缩写:s)
fixup: 将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec: 执行shell命令(缩写:x)
drop: 我要丢弃该commit(缩写:d)
例如
pick hash. add a.java
s hash. add b.java
# 将合并注释信息
将某一段commit粘贴到另一个分支上
# (startpoint, endpoint]
git rebase [startpoint] [endpoint] --onto [branchName]
git checkout master
git reset --hard 0c72e64
跨团队协作
fork
pull requests
merge pull request
SSH登录
ssh-keygen -o -t rsa -b 4096 -C "sumy45276@hundsun.com"
cat ~/.ssh/id_rsa.pub
/mingyue
cd ~
rm -rvf .ssh
ssh-keygen -t rsa -C 284908631@qq.com
查看文件列表
- cd .ssh
- ls -lF
- cat id_rsa.pub
复制内容,头像->settings->SSH and GPG keys
new ssh key
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git add .
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git commit -m "更新系统管理员题目删除功能,psedu_exam_problem中status字段0为正 常,-1为删除,选题题目时进行status的判断"
[master 61faeb8] 更新系统管理员题目删除功能,psedu_exam_problem中status字段0为正 常,-1为删除,选题题目时进行status的判断
6 files changed, 19 insertions(+), 11 deletions(-)
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git reflog
61faeb8 HEAD@{0}: commit: 更新系统管理员题目删除功能,psedu_exam_problem中status 字段0为正常,-1为删除,选题题目时进行status的判断
7c67115 HEAD@{1}: clone: from https://e.coding.net/daioo/hnustdx.git
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git remote -v
origin https://e.coding.net/daioo/hnustdx.git (fetch)
origin https://e.coding.net/daioo/hnustdx.git (push)
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git pull origin master
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (1/1), done.
From https://e.coding.net/daioo/hnustdx
* branch master -> FETCH_HEAD
7c67115..6a9696e master -> origin/master
Auto-merging psedu/Home/Controller/ExamController.class.php
Merge made by the 'recursive' strategy.
psedu/Home/Controller/ExamController.class.php | 12 +++++++++---
psedu/Home/Controller/IndexController.class.php | 4 ++--
psedu/Home/Controller/UserController.class.php | 8 --------
psedu/Home/View/Exam/exam.html | 2 ++
4 files changed, 13 insertions(+), 13 deletions(-)
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git reflog
5373efa HEAD@{0}: pull origin master: Merge made by the 'recursive' strategy.
61faeb8 HEAD@{1}: commit: 更新系统管理员题目删除功能,psedu_exam_problem中status字段0为正常,-1为删除,题题目时进行status的判断
7c67115 HEAD@{2}: clone: from https://e.coding.net/daioo/hnustdx.git
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git diff master
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git diff
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git branch -v
* master 5373efa [ahead 2] Merge branch 'master' of https://e.coding.net/daioo/hnustdx
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git branch -av
* master 5373efa [ahead 2] Merge branch 'master' of https://e.coding.net/daioo/hnustdx
remotes/origin/Fightjiang 625859f 学员考试提交试卷前发送 hearbeat_packet 维持登录状态
remotes/origin/HEAD -> origin/master
remotes/origin/Mingyue 7c67115 Accept Merge Request #54: (Fightjiang -> master) Merge Request: Fix 评教系统 bug Created By: @Fightjiang Accepted By: @Fightjiang URL: https://daioo.coding.net/p/hnustdx/d/hnustdx/git/merge/54
remotes/origin/master 6a9696e Accept Merge Request #55: (Fightjiang -> master) Merge Request: 学员考试相关功能 Created By: @Fightjiang Accepted By: @Fightjiang URL: https://daioo.coding.net/p/hnustdx/d/hnustdx/git/merge/55
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git branch -rv
origin/Fightjiang 625859f 学员考试提交试卷前发送 hearbeat_packet 维持登录状态
origin/HEAD -> origin/master
origin/Mingyue 7c67115 Accept Merge Request #54: (Fightjiang -> master) Merge Request: Fix 评教系统 bug Created By: @Fightjiang Accepted By: @Fightjiang URL: https://daioo.coding.net/p/hnustdx/d/hnustdx/git/merge/54
origin/master 6a9696e Accept Merge Request #55: (Fightjiang -> master) Merge Request: 学员考试相关功能 Created By: @Fightjiang Accepted By: @Fightjiang URL: https://daioo.coding.net/p/hnustdx/d/hnustdx/git/merge/55
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git add .
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git commit -m "更新系统管理员题目删除功能,psedu_exam_problem中status字段0为正常,-1为删除,选题题目时On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git push origin master Mingyue
error: src refspec Mingyue does not match any.
error: failed to push some refs to 'https://e.coding.net/daioo/hnustdx.git'
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
$ git push origin master origin/Mingyue
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (24/24), 7.63 KiB | 0 bytes/s, done.
Total 24 (delta 17), reused 0 (delta 0)
To https://e.coding.net/daioo/hnustdx.git
6a9696e..5373efa master -> master
* [new branch] origin/Mingyue -> origin/Mingyue
苏明月@Huawei MINGW64 /e/xampp_new/htdocs/dashboard/hnustdx0 (master)
关联分支
本地和远程的关系
# 查看关联
git branch -vv
# 配置关联
## 1 提交时配置
git push -u origin <remote_branch>
## 2 切出时配置,切出到dev ,关联origin/dev分支
git checkout -b dev origin/dev
## 3 直接更改
git branch --set-upstream-to=<remote_branch>
工作流程
1、git checkout
2、git checkout -b dev origin/dev
3、开发,每天pull更新代码
五、常见问题
1. 最后一次代码提交时有拼写错误
经过几个小时的编码后,拼写错误很容易带到你的提交消息里面。 幸运的是,有一个简单的解决方案。
git commit --amend
这会打开编辑器,并允许你更改最后一次提交消息。 没有人知道你把“addded”单词多加了一个字母“d”的拼写错误。
2. 忘了在最后一次提交中添加文件
另一个常见的Git陷阱是过早提交。 你少添加了一个文件,忘了保存它,或者需要对最后一次提交做一个小改动才有意义。 --amend
再次成为你的朋友。
添加错过的文件然后运行该命令。
git add missed-file.txt
git commit --amend
此时,可以修改提交消息,也可以只保存它以使其保持不变。
3. 在代码库中添加了一个不想要的文件
但如果你的做法的正好相反呢?如果添加了不想提交的文件怎么办?一个环境文件,一个构建目录,或者是一张图片不小心保存到错误的目录?这都是可以解决的。
如果你所做的只是对文件进行了stage操作放入了暂存区,还没有commit本地代码仓库,那么只需重新设置暂存区的文件即可:
git reset /assets/img/misty-and-pepper.jpg
如果已经提交了更改,那么需要先运行一个额外的步骤:
git reset --soft HEAD~1 // head^
git reset /assets/img/misty-and-pepper.jpg
rm /assets/img/misty-and-pepper.jpg
git commit
这将撤销提交,删除图片文件,然后在其位置添加一个新的提交。
4. 提交了所有的修改到 master 分支
你正在开发一个新特性,在匆忙之中,忘记为它打开一个新的分支。已经提交了一堆文件,现在它们都位于主分支(master)上。幸运的是,GitLab可以防止你直接推到master 主分支上。因此,我们可以使用以下三个命令将所有这些更改回滚到一个新分支:
Note
确保首先commit或stash更改,否则所有更改都将丢失!
git branch future-brunch
git reset HEAD~ --hard
git checkout future-brunch
这会创建一个新分支,然后将主分支回滚到进行更改之前的位置,然后最终检出新分支,并保留所有先前的更改。
5. 分支名称出现了拼写错误
对错误分支进行重命名的方式与用mv
命令重命名文件的方式类似:将它移动到一个新的位置,并使用正确的名称。例如把future-brunch分支名称更改为feature-branch。
git branch -m future-brunch feature-branch
如果已经push了这个分支到远程代码仓库,那么还需要一些额外的步骤。需要从远程代码仓库删除旧的分支,将新分支 push 上去:
git push origin --delete future-brunch
git push origin feature-branch
6. 重复操作
这个命令适用于一切都出错的地方。 当从Stack Overflow复制粘贴一个太多的解决方案时,
代码仓库处于比你一开始时更糟糕的状态。git reflog
向你显示所有的事情列表。然后,它允许你使用Git的神奇时间旅行技巧,回退到过去的任何时间点。这里应该指出,这是最后的手段,不应该轻易使用。要得到这个列表,输入:
git reflog
我们采取的每一步,我们所做的每一个动作,Git都有记录。 在我们的项目上运行该命令得到以下列表:
3ff8691 (HEAD -> feature-branch) HEAD@{0}: Branch: renamed refs/heads/future-brunch to refs/heads/feature-branch
3ff8691 (HEAD -> feature-branch) HEAD@{2}: checkout: moving from master to future-brunch
2b7e508 (master) HEAD@{3}: reset: moving to HEAD~
3ff8691 (HEAD -> feature-branch) HEAD@{4}: commit: Adds the client logo
2b7e508 (master) HEAD@{5}: reset: moving to HEAD~1
37a632d HEAD@{6}: commit: Adds the client logo to the project
2b7e508 (master) HEAD@{7}: reset: moving to HEAD
2b7e508 (master) HEAD@{8}: commit (amend): Added contributing info to the site
dfa27a2 HEAD@{9}: reset: moving to HEAD
dfa27a2 HEAD@{10}: commit (amend): Added contributing info to the site
700d0b5 HEAD@{11}: commit: Addded contributing info to the site
efba795 HEAD@{12}: commit (initial): Initial commit
记下最左边的列,因为这是索引。 如果要返回历史记录中的任何一点,请运行以下命令,将{index}
替换为该引用,例如dfa27a2
。
git reset HEAD@{index}
Note
文章原文:Git happens! 6 Common Git mistakes and how to fix them
文章作者:Sam Beckham
7.文件忽略无效
原因:.idea已经被git跟踪,之后再加入.gitignore后是没有作用的
git rm -r --cached .idea
.gitignore中添加.idea
8.远程拉取分支并创建
git branch -r
方式1
git checkout -b 本地分支名x origin/远程分支名x
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
方式2
git fetch origin 远程分支名x:本地分支名x
使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
采用此种方法建立的本地分支不会和远程分支建立映射关系。
9.日志类型
- feat:新功能(feature)
- fix:修补bug
- docs:文档(documentation)
- style: 格式(不影响代码运行的变动)
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- test:增加测试
- chore:构建过程或辅助工具的变动
10.文件恢复上一个版本
git checkout a57fb4b474888f0db4cba18de2180496 src/index.java
# 没有add
git checkout -- 文件名
# 所有
git checkout .
# add
git rm --cached file
文件不被git追踪,并且它是修改的状态,没有提交到暂存区。此时,你用git checkout -- file是没有用的。因为,前面提到过,git checkout -- file是回到最近的一次commit或者add。但是,当前你还没有一次commit过,并且,add也已经撤销了,所以Git找不到该文件在以往记录中的存在。自然没法用git checkout -- file
此时,你可以任意的对此文件进行修改了,想好了之后,再提交到暂存区
# commit
则先:git reset HEAD file让该文件回到工作区的状态。
然后:git chekcout -- file即可
11.暂存未提交的分支,切换分支
https://blog.csdn.net/hxdafei1989/article/details/64921521
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
六、报错
认证
remote: HTTP Basic: Access denied
git config --system --unset credential.helper
控制面板,修改凭证
! [remote rejected] master -> master (pre-receive hook declined)
设置允许推送master。。
OpenSSL SSL_read: Connection was reset, errno 10054
git config –global http.sslVerify “false”