git深入浅出

@TOC

patch 
fork https://www.jianshu.com/p/f443acc8e79d
diff
commit -am 和 commit -m
reset 和 revert
reset --mixed --soft --hard
恢复工作区、暂存区
rebase
merge

diff差异

工作区和暂存区 :  git diff 

工作区和HEAD  :  git diff  HEAD

暂存区和HEAD  :  git diff  --cached

不同分支的差异 :  git diff  dev1.0  master

不同commit的差异:git diff  sha1 sha2

指定文件: git diff sha1 sha2 -- test/ab.txt

说明:对于新增的文件,其只存在于工作区,且处于 Untracked 状态,Git 认为无论是哪两个 Git 区域之间的比对都没有意义,得到的结果是没有区别。使用git status查看;

撤销操作

本地仓库恢复暂存区内容 :
git reset HEAD -- 文件名   # 对某个文件进行恢复                    
git reset HEAD -- path    # 对某个路径进行恢复    
git reset HEAD            # 对所有文件进行恢复
(使用 git diff -cached 做比较)
 
暂存区恢复工作区内容 :  
git checkout -- 文件名     # 对某个文件进行恢复
git checkout -- path      # 对某个路径进行恢复 
git checkout              # 对所有文件进行恢复
(使用 git diff 做比较)

本地仓库恢复工作区和暂存区内容 :
git reset --hard HEAD
(使用 git diff HEAD 工作区和本地仓库做比较)
              
git reset HEAD 本地仓库对暂存区的恢复,加了--hard,对工作区也一起恢复。              

回到某个commit有两种方式:reset和revert(恢复)

git reset HEAD
git reset commit_id

git revert HEAD
git revert -n commit_id    -n 表示不立即commit,只是恢复工作区内容。

git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。

清除工作区变化

git reset --hard HEAD
git clean -df

清除暂存区变化

git rm -r --cached .
git rm -r --cached -- index.jsp

从工作目录中删除所有没有tracked过的文件和目录-d

git clean -df 

说明:git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以需要clean来删除没有track过的文件. 结合使用这两个命令能让你的工作目录完全回到一个指定的的状态
git clean的用法

.gitignore

.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
输入:
git rm -r –cached filePath
git commit -m “remove xx”
或者:
git rm -r –cached .
git add .
git commit -m “update .gitignore”

来解释下几个参数 -r 是删除文件夹及其子目录 –cached 是删除暂存区里的文件而不删除工作区里的文件,第一种是删除某个文件,第二种方法就把所有暂存区里的文件删了,再加一遍,相当于更新了一遍。

玩转git三剑客

第一章:Git基础 (13讲)

1、分布式版本控制与集中式版本控制区别

git 为分布式版本控制

svn 为集中式版本控制

跟踪文件和未跟踪文件

Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot; they can be unmodified, modified, or staged. In short, tracked files are files that Git knows about.

Untracked files are everything else — any files in your working directory that were not in your last snapshot and are not in your staging area. When you first clone a repository, all of your files will be tracked and unmodified because Git just checked them out and you haven’t edited anything.

请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

本地分支、远程分支、本地追踪分支

下面以dev1.0分支做说明

本地分支指:本地仓库分支dev1.0
远程分支指:github上仓库分支dev1.0
本地追踪分支:origin/dev1.0。 通过git branch--set-upstream-to 和 git push --set-upstream 建立的本地追踪分支;

git -- 分支基本介绍

2、git帮助

git help web commit #浏览器的方式打开帮助文档
git commit --h
git commit --help

3、git 配置

# git config 缺省值--local ,即单个仓库有效
git config --local user.name  "test"
git config --local user.email "*********@qq.com"

git config --global user.name  --操作系统当前用户下所有仓库有效
git config --system user.name  --操作系统所有用户下任何仓库有效

查看相关的配置
git config  --local   --list 
git config  --global  --list
git config  --system  --list

提交代码用户优先级local > global > system

git config内容可以直接通过查看或编辑.git/config,进行改变。

4、在本地创建仓库

两种情景创建Git本地仓库

# 在还没有git管理的项目目录里执行(将已有的项目代码纳入到git管理)
git init 

# 新建git管理项目
git init 想创建新的项目的名称

5、commit、工作区和暂存区

工作区 为目前系统所在目录的区域,即我们现在操作的目录
暂存区 为git管理的一个区域,对我们而言是透明的。提交到版本历史前,先提交到暂存区,再提交到工作区。

git commit -m  "需要先执行git add . ,把工作区的内容提交到暂存区,才能提交暂存区内容到历史版本库"
git commit -am "把工作区的已经被跟踪的变化内容提交到历史版本库中"

字面解释的话,git commit -m用于提交暂存区的文件;git commit -am用于提交跟踪过的文件

暂存区操作

# 清除暂缓区
git rm -r --cached .
# 添加当前目录下所有文件到暂缓区
git add .

add

git add .   # 当前目录下所有文件
git add -u  # 更改的跟踪文件(update tracked files)
git add 某个特定的文件名
git add index.js images/ # add 后面可以加多个文件或者目录名称

ahead 和behind

ahead  表示,你本地仓库提交了几个commit,还没有push到远程仓库
behind 表示,远程仓库的commit比你还新

你本地commit了代码,没有push,就是超前ahead。
remote上有更新,本地没有pull,就是落后behind。

既ahead又behind :你本地commit了几个版本,而你同事又push了几个commit到远程仓库;
解决方案:先pull下来,然后再处理冲突后git add .再git commit 再git pull,再push。

6、重命名文件名

第一种方式

mv readme readme.md
git add readme.md
git rm readme
git status
git commit -m 'move readme to readme.md'

第二种方式

git reset --hard HEAD~1 【清理掉刚才的暂存区和工作目录到上一个版本】
git mv readme readme.md
git status # 可以看到修改的内容已添加到暂存区里面
git commit -m 'move readme to readme.md'

综上所示:以给文件名重命名时,推荐使用第二种方式。

7、git log 查看历史版本信息

git log # 查看当前分支的历史版本
git log 分支名 # 查看指定的分支的历史版本 
git log --all # 展示所有分支,对应的所有的历史版本


git log --oneline   # 每条commit都只展示一行
git log -n 4        # 查看最新提交的四条commit
git log dev -n 4     # 展示某个分支对应的历史版本
git log --all --graph       # 使用图形化展示
git log -n 4  --all --graph # 使用图形化展示


其他补充
git checkout -b 新分支名称 commitid
如:git checkout -b dev 1e29e8a0c291  # 从master的1e29e8a0c291这个commit处拷贝作为dev的分支起点 。

log和relog的区别:git relog 时光穿梭机

8、gitk图形化查看版本历史

gitk --all

view菜单 -> all tags等等

9、探秘.git 目录

HEAD  文件记录当前指向哪个分支(内容如:ref: refs/heads/master---只记录是哪个分支,而refs/heads/master记录了分支的最新commit的id)

cofig 文件记录了git config --local 的一些信息,可直接通过修改该文件。通过git config --local --list 可以看到立即生效

ref
  ---tags #目录是记录tag的信息
  ---heads # heads目录存放仓库的所有分支的最新commit id
      --master 文件记录了master分支的最新commit的id(HEAD文件显示的路径:refs/heads/master)
      --dev 文件记录了dev分支的最新commit的id

git cat-file -t hash值 # 查看该对象的类型
git cat-file -p hash值 # 查看该对象的内容

logs
  ---refs
       ---heads
            --dev    # 记录gitlog dev的信息
            --master # 记录gitlog master的信息
  ---HEAD #记录历史操作信息。

objects
   --保存一些commit的信息 有tree(目录)、blob(文件)

10、commit、tree、blob

commit 里面的tree(912fa6) ,代表项目根目录
项目根目录tree里面的tree,代表根目录里的目录。项目根目录tree里面的blob代表根目录下文件

11、数一数tree的个数

1、查看objects目录下文件的类型

$ find .git/objects -type f  # .git/objects 存放一些commit、tree、blob对象
$ find objects/ -type f
objects/01/19554bbf42733a437964d51afba5b882c88ef8
objects/0a/d6b7c87658dd85ea65462327a5d1b8b678b821
objects/12/d615fa5e56dd4000f7b35ee8d3f82d182b59ae
objects/1e/29e8a0c291504ab77cf51d90202c9177757b09

2、查看hash_id的类型

$ git cat-file -t 0119554

3、查看hash_id的内容

$ git cat-file -p 0119554

12、 分离头指针 the detached HEAD

创建分离头指针:

git checkout commit_id  此时 git log 可以看到HEAD不指向任何分支
危险:存在分离头指针时,git checkout 到汽油现有分支,会将分离头时提交的commit清空

创建分支:

git checkout -b fix_name commit_id
如下:
git checkout -b dev1.0 052c236
git checkout -b fix_20200110 master
git checkout -b dev2.0 github1/master

13、 进一步理解HEAD和branch关系

HEAD和branch名

HEAD        代表当前分支或分离头指针指向的最新的commit_id
branch名    代表该分支最新的commit_id

创建分支

git checkout -b fix_name commit_id
git checkout -b fix_name dev1.0(想要从哪个仓库checkout的分支名)

HEAD~2 最新commit往前2个

git diff commit_id1 commit_id2

git diff HEAD HEAD~1

master也可以代表指针

$ cat .git/refs/heads/master
55a6c62f43ce014eb9d6a906c757e8a78d82ffd5

$ git cat-file -t 55a6c62
commit

第二章:独自使用Git时的常见场景 (16讲)

章节:14 - 29 讲

14、删除不需要的分支

git branch -d 分支名
# 强制删除分支
git branch -D 分支名  

使用-d 可能出现下面问题:

$ git branch -d dev1.0
error: The branch 'dev1.0' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev1.0'.

该问题表示现在还没有完全跟上游分支进行merge,需要git pull后git push 。使dev1.0内容上传到远程仓库分支
$ git branch -d dev1.0
warning: deleting branch 'dev1.0' that has been merged to
         'refs/remotes/github/dev1.0', but not yet merged to HEAD.
Deleted branch dev1.0 (was da7c0af).

上面表示:还没有跟当前分支的HEAD进行合并

git branch --no-merged # 查看还没有和当前分支合并的分支

解决方案:
master$ git merge dev1.0 # 将dev1.0合并到master分支再删除即可
master$ git branch -d dev1.0 # 只是删除了本地分支,远程分支和跟踪分支(orign/dev1.0)未删除

git -- 删除分支

15 - 18 都只适合本地的commit还未集成到远程分支上面。如果远程分支已经保留了该commit,则不建议使用,因为更改后,会产生新的commit_id值。从而导致其他团队出现不必要的冲突问题。

15 、修改最新commit的message信息(这种方式只建议用在远程仓库还没有这些commit情况下使用,即还没有push到远程仓库)

git commit --amend

16、 修改老旧commit的message (这种方式只建议用在远程仓库还没有这些commit情况下使用,即还没有push到远程仓库)

git rebase 变基

危险:已经跟远程仓库进行集成的分支,严禁执行rebase变基操作;

(1) git rebase -i 要变基的commit的父亲的commit id
-i 后面为 基于这个要修改message的commit的父亲的commit_id.因为这个要更改message的commitrebase后,commit id 会变成新的commit id

pick 12d615f add style.css
r c348323 add js
pick 7617a5c 修改了script.js
# r, reword  = use commit, but edit the commit message

将要修改message的pick修改成r,然后保存。保存后会弹出message,进行修改message后保存。

说明:已经push到远程的commit不能这么去rebase,容易导致团队其他队友本地版本出现混乱,别人的commit还存在旧的commit id,而你自己rebase后commit已经是最新的;

17、 把连续的多个commit整理成一个(这种方式只建议用在远程仓库还没有这些commit情况下使用,即还没有push到远程仓库)

git rebase -i 要变基的commit的父亲的commit id

pick a242ca7 master添加了a.txt文件
s 5aeb851 master添加了b.txt文件
s dd67663 master添加了c.txt文件
s 3f6e9b  master添加了d.txt文件
s b377016 master添加了e.txt文件

填写在-i的commit需要为pick,而不能改成s。

18、把间隔的几个commit整理成一个(这种方式只建议用在远程仓库还没有这些commit情况下使用,即还没有push到远程仓库)

同17操作,只是把间隔的几个commit_id 挨在一起提交      

19、 比较暂存区和HEAD的差异

git diff --cached

+ 是代表跟HEAD比较,暂存区新增的内容
- 是代表跟HEAD比较,暂存区删除的内容

20、比较工作区和暂存区的差异

git diff
git diff --文件名

20.1、比较工作区和HEAD的差异

git diff HEAD
git diff HEAD --文件名

21、暂存区恢复到HEAD一样

git reset HEAD
git reset HEAD 文件名
git diff --cached

22、工作区恢复到暂存区一样

git checkout -- 文件名
git checkout .  # 使用暂存区恢复工作区所有跟踪文件

22.1、 暂存区和工作区恢复到HEAD一样

git reset --hard HEAD   

https://www.jianshu.com/p/c2ec5f06cf1a

23、取消暂存区部分文件的修改(与21讲重复)

git reset HEAD -- 文件名       # 从暂存区单独删除某个文件
git reset HEAD .              # 取消暂存区文件所有文件的修改
 $ 取消工作区所有untracked file 一次性删除
 git  clean  -f

24、 取消最近几次提交(这种方式只能是在远程仓库还没有commit情况下使用,即还没有push到远程仓库)

git reset --hard 想保留的commit_id #保留commit之后的commit会被清空 ---慎重
一般不推荐取消最近几次提交,弄不好commit的历史丢失

25、查看不同提交的指定文件的区别

git diff commit_id1 commit_id2
git diff dev1.0 master
git diff dev1.0 master -- index.jsp 两个分支index.jsp的差异

26、正确的删除文件

git rm index.jsp

27、保留当下暂存区和工作区的修改内容

git stash  --执行后,相当于吧暂存区和工作区跟HEAD的差异内容进行保存。作用于在开发需要处理紧急工作,切换到其他分支进行纯净开发。
git stash list ---查看所有stash

git stash pop    --- 弹出后,这个stash就没有
git stash apply  --- 可以反复使用stash内容

28、.gitignore

*.class
*.abc/  ----只过滤掉*.abc目录下的文件,不会过滤掉*.abc命名的文件
*.abc   ----过滤掉*.abc目录下的文件和滤掉*.abc命名的文件
*/bin/
*/output/

29、git仓库备份到本地

哑协议和智能协议
$ git clone --bare file:///d/users/test/.git ya.git  ---只有.git目录下内容
$ git pull ya2

远程仓库是远程仓库,本地仓库是本地仓库,本地仓库要跟远程仓库进行关联,需要使用--set-upstream 建立起跟踪关系
$ git branch --set-upstream-to=ya2/dev1.0

git查看看跟踪关系

git branch -vv

说明:git branch--set-upstream-to 和 git push --set-upstream 后可以通过git branch -vv命令查看本地分支和远程仓库分支的跟踪关系。

第三章:Git与GitHub的简单同步 (4讲)

章节:30 - 33 讲

Fast forward(快进模式)和 no-ff 区别

查看远程仓库

git remote -v

添加远程仓库

git remote add github1 [email protected]:git202001/git_learnling.git
git remote -v

# github1 这个是对远程仓库地址起的一个名字。可自定义,如缺省origin  

将所有分支都push到远程仓库

git push github1 --all           # 不加all,只push 当前分支到远程分支

push过程中出错

 git push github1 --all
 
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/....se.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决:
(第一步) master$ git fetch github1 master
(第二步) master$ git merge --allow-unrelated-histories github1/master

第二步--allow-unrelated-histories参数,是因为github1/master 和 本地master还没有建立关系,需要加这个参数才可以进行merge;


疑问:是否可以在本地master分支下先git push -u github1/master,再git pull github1解决?
答案依旧是不行的。还是会提示because the remote contains work that you do not have locally.
$ git push origin
fatal: The current branch dev1.0 has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin dev1.0
    
解决方案:
$ git push --set-upstream origin dev1.0

建立本地master分支和远程master分支跟踪关系,并提交到远程master

master$ git push -u origin master

第四章:Git多人单分支集成协作时的常见场景 (5讲)

章节:34 - 38讲

git clone url 本地仓库名
git clone https://------/git_learning.git git_learning2
git pull
git status
git push

第五章:Git集成使用禁忌 (2讲)

章节:39-40讲

39、禁止向集成分支执行 push -f操作

git reset --hard commit_id的位置
git push -f 
会使得远程仓库分支的变更历史回到commit_id的位置

40、禁止向集成分支(远程仓库分支)执行rebase变更历史操作

一定要新增commit,对集成分支进行修改,而不是rebase修改历史操作

第六章:初识GitHub (6讲)

章节:41-46讲

help.github.com

[email protected]

----------高级搜索

在搜索框输入的内容是在“名称和描述”进行搜索;

readme 的内容要好好写,人家比较容易同个 in:readme 搜索到

created:<2018-12-24
git 最好 学习 资料 in:readme start:>1000
blog easily start in:readme start:>1000
'这是我想在gitlab-ci文件查找的内容' '这是第二查找的内容' filename:gitlab-ci.yml

第七章:使用GitHub进行团队协作 (10讲)

章节:47-56讲

GitHub 实现多人协同提交代码并且权限分组管理

第八章:GitLab实践 (6讲)

章节:57-62讲


(commit之前,多看下status里面,修改了什么)

(diff temp master,分支的名字代表分支的HEAD的版本号)

独自使用git时的常见情景

git log --oneline -n 5 --graph ## 每条commit只显示一行,且显示最近5条

14怎么删除不需要的分支

git branch -d 分支名

git branch -D 分支名 ---强制删除

15怎么修改最新commit的message?

git commit -amend ##可修改最新的commit的message

16怎么修改老旧commit的message?

git rebase -i 版本号 ## 对本地自己commit的内容进行修改。

版本号的hash值是父类,而不是它本身哦!

注: 千万不能对已经提交到远程的message进行修改

17怎样把连续的多个commit整理成1个?

git rebase -i (hash值) ## 对本地自己commit的内容进行修改。

hash值是父类,而不是它本身哦!道理同上。

注: 千万不能对已经提交到远程的message进行修改

19怎么比较暂存区和HEAD所含文件的差异?

git diff --cached

20怎么比较工作区和暂存区所含文件的差异?

git diff

git diff -- 文件名

21如何让暂存区恢复成和HEAD的一样?

git reset HEAD

git reset HEAD -- index.html css/font.css 指定恢复某个文件

22如何让工作区的文件恢复为和暂存区一样

git checkout -- index.html

git diff

23怎样取消暂存区部分文件的更改?

git reset HEAD -- index.html css/font.css 指定恢复某个文件

git reset --hard HEAD  ## 暂存区和工作区都恢复成HEAD

24消除最近的几次提交

git reset -hard 版本号 危险的,不建议。用git resvert代替

25看看不同提交的指定文件的差异

git diff temp master -- index.html

git diff commit_1 commit_2 ## 两个commit的值_

git reset --hard HEAD

26正确删除文件的方法

rm readme.txt ## 删除文件

git rm  ## 删除的命令提交到暂存区

git commit -m ""

等价于

git rm readme.txt

git commit -m ""

27开发中临时加塞了紧急任务怎么处理?

git stash

git stash --list

git stash apply ## 把stash的内容恢复到工作区

git stash pop ## 把stash的内容恢复到工作区,并把stash删除了

28如何指定不需要Git管理的文件?

vim .gitignore

doc/ 是doc目录和doc目录下的内容被忽略

doc 则doc文件,doc目录和doc目录下的内容被忽略

快速

springcloud stars:>1000

after_script filename:.gitlab-ci.yml

pull是为了本地 commit 和远程commit 的对比记录,git 是按照文件的行数操作进行对比的,如果同时操作了某文件的同一行那么就会产生冲突,git 也会把这个冲突给标记出来,这个时候就需要先把和你冲突的那个人拉过来问问保留谁的代码,然后在git add && git commit && git pull这三连,再次 pull 一次是为了防止再你们协商的时候另一个人给又提交了一版东西,如果真发生了那流程重复一遍,通常没有冲突的时候就直接给你合并了,不会把你的代码给覆盖掉

fast_forwards

34不同人修改了不同文件如何处理?

git checkout -b dev1.0 origin/dev1.0 ## 从原始dev1.0 仓库拷贝一份到本地分支1.0

git fetch ## 从远端拉分支

--set-upstream 将本地和远程的绑定好对应关系

撤销会特定版本

先简单说一下,在提交到远程库之前我们使用git reset 命令完全可以满足我们 撤销操作的需求,如果操作已经提交到远程库,那只好使用 git revert 来提交一个新的撤销操作 撤销 需要撤销的那次commit。

git reset --hard 目标版本号”命令将版本回退

git push -f 用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧

实践:

实践一:
  1. 先init一个本地仓库

  2. 提交到github

问:中间会出现什么问题

实践二:

从github拉下来一个版本

新建分支dev1.0 (远程没有dev1.0版本)

git checkout -b dev1.0 dev1.0 会怎样

估计先新建本地分支dev1.0,修改后push的时候直接提交?

git checkout -b dev2.0 后修改dev2.0(远程没有dev2.0版本)分支会push怎样

我的建议:在Mac上设置 autocrlf = input, 在Windows上设置autocrlf = true(默认值)。

这样的话,
Windows:(true)
提交时,将CRLF 转成 LF再提交;
切出时,自动将LF 转为 CRLF;

MAC/Linux: (input)
提交时, 将CRLF 转成 LF再提交;
切出时,保持LF即可

这样即可保证仓库中永远都是LF. 而且在Windows工作空间都是CRLF, 在Mac/Linux工作空间都是LF.

作者:Ginta
链接:https://www.jianshu.com/p/0a747b2b76a2
来源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git remote -v

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git remote --h
error: unknown option `h'
usage: git remote [-v | --verbose]
   or: git remote add [-t ] [-m ] [-f] [--tags | --no-tags] [--mirror=]  
   or: git remote rename  
   or: git remote remove 
   or: git remote set-head  (-a | --auto | -d | --delete | )
   or: git remote [-v | --verbose] show [-n] 
   or: git remote prune [-n | --dry-run] 
   or: git remote [-v | --verbose] update [-p | --prune] [( | )...]
   or: git remote set-branches [--add]  ...
   or: git remote get-url [--push] [--all] 
   or: git remote set-url [--push]   []
   or: git remote set-url --add  
   or: git remote set-url --delete  

    -v, --verbose         be verbose; must be placed before a subcommand


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git remote add https://github.com/cjf1002361126/test005.git
usage: git remote add []  

    -f, --fetch           fetch the remote branches
    --tags                import all tags and associated objects when fetching
                          or do not fetch any tag at all (--no-tags)
    -t, --track   branch(es) to track
    -m, --master 
                          master branch
    --mirror[=(push|fetch)]
                          set up remote as a mirror to push to or fetch from


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git remote add test005 https://github.com/cjf1002361126/test005.git

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git remote -v
test005 https://github.com/cjf1002361126/test005.git (fetch)
test005 https://github.com/cjf1002361126/test005.git (push)

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git pull test005
warning: no common commits
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/cjf1002361126/test005
 * [new branch]      master     -> test005/master
You asked to pull from the remote 'test005', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git branch -v
* dev1.0 b664094 master添加了b.txt
  master b664094 master添加了b.txt

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git branch -av
* dev1.0                 b664094 master添加了b.txt
  master                 b664094 master添加了b.txt
  remotes/test005/master 4b84137 Initial commit

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git push test005 --all
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 479 bytes | 239.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'dev1.0' on GitHub by visiting:
remote:      https://github.com/cjf1002361126/test005/pull/new/dev1.0
remote:
To https://github.com/cjf1002361126/test005.git
 * [new branch]      dev1.0 -> dev1.0
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/cjf1002361126/test005.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git branch -av
* dev1.0                 b664094 master添加了b.txt
  master                 b664094 master添加了b.txt
  remotes/test005/dev1.0 b664094 master添加了b.txt
  remotes/test005/master 4b84137 Initial commit

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ gitk --all

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ gitk --all

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git pull test005 dev1.0
From https://github.com/cjf1002361126/test005
 * branch            dev1.0     -> FETCH_HEAD
Already up to date.

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ echo "c" > c.txt

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git add .
warning: LF will be replaced by CRLF in c.txt.
The file will have its original line endings in your working directory

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git commit -m "dev1.0添加了c.txt"
[dev1.0 6e4ad14] dev1.0添加了c.txt
 1 file changed, 1 insertion(+)
 create mode 100644 c.txt

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git push
0


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git push test005
fatal: The current branch dev1.0 has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream test005 dev1.0


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$   git push --set-upstream test005 dev1.0
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 305 bytes | 305.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/cjf1002361126/test005.git
   b664094..6e4ad14  dev1.0 -> dev1.0
Branch 'dev1.0' set up to track remote branch 'dev1.0' from 'test005'.

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ gitk --all

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (dev1.0)
$ git checkout master
Switched to branch 'master'

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ ll
total 2
-rw-r--r-- 1 cjf 197121 5 1月  27 16:41 a.txt
-rw-r--r-- 1 cjf 197121 6 1月  27 16:43 b.txt

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ echo "d.txt" > d.txt

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git add .
warning: LF will be replaced by CRLF in d.txt.
The file will have its original line endings in your working directory

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using

    git remote add  

and then push using the remote name

    git push 


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git push test005
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream test005 master


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git push --set-upstream test005 master
To https://github.com/cjf1002361126/test005.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/cjf1002361126/test005.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ ^C

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull  

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=test005/ master


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git pull test005
You asked to pull from the remote 'test005', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git pull test005 master
From https://github.com/cjf1002361126/test005
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ gitk --all

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ gitk --all

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git merge --allow-unrelated-histories
dev1.0           HEAD             ORIG_HEAD        test005/master
FETCH_HEAD       master           test005/dev1.0

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git merge --allow-unrelated-histories test005/master
error: Your local changes to the following files would be overwritten by merge:
  d.txt

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ gitk --all

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git commit -m "master添加了d.txt"
[master 417e77b] master添加了d.txt
 1 file changed, 1 insertion(+)
 create mode 100644 d.txt

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git merge --allow-unrelated-histories test005/master
Merge made by the 'recursive' strategy.
 .gitignore | 23 +++++++++++++++++++++++
 README.md  |  1 +
 2 files changed, 24 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 README.md

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ gitk --all

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using

    git remote add  

and then push using the remote name

    git push 


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git push test005
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream test005 master


cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$   git push --set-upstream test005 master
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 595 bytes | 595.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/cjf1002361126/test005.git
   4b84137..ee2880a  master -> master
Branch 'master' set up to track remote branch 'master' from 'test005'.

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ gitk --all

cjf@DESKTOP-RM9U0H6 MINGW64 /f/gitlearn/github/test005 (master)
$ git push
Everything up-to-date
用git pull来更新代码的时候,遇到了下面的问题:error: Your local changes to the following files would be overwritten by merge: xxx/xxx/xxx.php Please, commit your changes or stash them before you can merge. Aborting

解决方案:
git stash
git pull
git stash pop

git add .
git commit -m ""
git pull
git push

作者:等不来的期待
链接:https://www.jianshu.com/p/920ad324fe64
来源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Git优势是容易创建本地仓库,将工作本地化,待需要的时候推送到远程仓库,因此所有修改可以在本地版本化。
Git的一大优势是很容易创建分支,根据需要可以快速创建Bug修复分支,新功能分支,几条分支独立开发,最后合并到主分支

 原则:
      a)master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面开发;
      b)开发都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
      c)每个开发人员都在自己dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

1、学习git,远程拉下来。
2、github 创建项目
3、git的版本控制

https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA%8E%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6

《登录篇》

git config user.name
git config user.email

git config --global user.name "code_chen"
git config --global user.email "[email protected]"

《分支篇》

创建分支
git branch dev1.0

查看创建的分支
git branch

创建后必须推送到远程服务器上,别人才能看到
git push origin dev1.0

切换分支
git checkout dev1.0

问题:

1、创建新分支,切换到新分支后,git pull提醒There is no tracking information for the current branch.
因为本地从服务器clone下该分支的跟踪信息,需要用 git branch --set-upstream-to=origin/dev1.0 dev1.0

fatal: not a git repository (or any of the parent directories): .git

svn

--- trunk(master)、branches(dev)、tags


你可能感兴趣的:(git深入浅出)