一、初始化

UTOOLS1589103322925.png

本地版本控制、集中版本控制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

image-20200510181905436

三、Git基本原理

哈希

image-20200325114109346image-20200325114128295

image-20200325114109346image-20200325114128295

文件管理机制

快照

Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git的工作方式可以称之为快照流

分流

image-20200325114350993

四、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”

无法账号密码

https://www.cnblogs.com/ponyjava/p/14252560.html