@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
----------高级搜索
在搜索框输入的内容是在“名称和描述”进行搜索;
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指向的版本比远程库的要旧
实践:
实践一:
先init一个本地仓库
提交到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