GIT说明手册
https://cloud.tencent.com/developer/section/1138656
学习GIT的动态网
https://learngitbranching.js.orghttps://github.com/pcottle/learnGitBranching
(Git知识总览(一) 从 git clone 和 git status 谈起:https://www.cnblogs.com/ludashi/p/8052739.html)
从远程仓库获取最新代码合并到本地分支
1.git pull:获取最新代码到本地,并自动合并到当前分支
$ git pull <远程主机名> <远程分支名>:<本地分支名>
//查询当前远程的版本
$ git remote -v
//直接拉取并合并最新代码
$ git pull origin master [示例1:拉取远端origin/master分支并合并到当前分支]
$ git pull origin dev [示例2:拉取远端origin/dev分支并合并到当前分支]
原文:https://blog.csdn.net/hanchao5272/article/details/79162130
分析:不推荐这种方式,因为是直接合并,无法提前处理冲突。
2.git fetch + merge: 获取最新代码到本地,然后手动合并分支
//查询当前远程的版本
$ git remote -v
//获取最新代码到本地(本地当前分支为[branch],获取的远端的分支为[origin/branch])
$ git fetch origin master [示例1:获取远端的origin/master分支]
$ git fetch origin dev [示例2:获取远端的origin/dev分支]
//查看版本差异
$ git log -p master..origin/master [示例1:查看本地master与远端origin/master的版本差异]
$ git log -p dev..origin/dev [示例2:查看本地dev与远端origin/dev的版本差异]
//合并最新代码到本地分支
$ git merge origin/master [示例1:合并远端分支origin/master到当前分支]
$ git merge origin/dev [示例2:合并远端分支origin/dev到当前分支]
git fetch origin master //从远程主机的master分支拉取最新内容
git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支中
git fetch 命令:
$ git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地
$ git fetch <远程主机名> <分支名> //如果只想取回特定分支的更新,可以指定分支名: 注意之间有空格
最常见的命令如取回origin 主机的master 分支:
$ git fetch origin master
取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:
$ git log -p FETCH_HEAD
原文:https://blog.csdn.net/hanchao5272/article/details/79162130
分支操作
git branch //查看本地所有分支
git branch -r //查看远程所有分支
git branch -a //查看本地和远程的所有分支
git branch //新建分支
git branch -d //删除本地分支
git branch -d -r //删除远程分支,删除后还需推送到服务器
git push origin: //删除后推送至服务器
git branch -m //重命名本地分支
1、每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master
分支”。
2、任何时候,HEAD所指向的分支就是当前分支。
3、执行git reset命令,HEAD指向reset命令后的事件的时间标记点
HEAD~是当前分支(时间线)上的时间标记点,包括HEAD、HEAD^、HEAD^^、HEAD~
(摘自:https://zhuanlan.zhihu.com/p/40001702)
HEAD~1指回退一个快照,可以简写为HEAD~
HEAD~2指回退两个快照,
HEAD^主要是控制merge之后回退的方向
HEAD~才是回退的步数
git reset HEAD
什么都不会发生, 指针指向当前位置
git reset --mixed HEAD~1HEAD~1 指上一个提交, HEAD~2 指上上一个提交
让暂存区和历史区与指定的提交保持一致,可以理解为撤销 git add
git reset --soft HEAD~1
让历史区与指定的提交保持一致,可以理解为撤销 git commit
git reset --hard HEAD~1
让工作区、暂存区和历史区都与指定的提交保持一致,可以理解为撤销所有改动
链接:https://www.jianshu.com/p/e84283d2f0f1
利用git reflog找回错误的重置
在开发中经常需要reset分支,如果在reset前没有记住分支指向的提交ID,想要重置回原来的提交恐怕大多数开发者是重新拉取远程版本库,再rebase分支。但如果连不上远程版本库或没有远程版本怎么办呢?git提供了一个挽救机制,git日志记录了分支的所以本地变更,通过它即可找回原来的代码。
下面我们来演示一下:
先查找本地操作日志:
git reflog show dev
上图可以看到我们有个错误的reset,下面的命令即可恢复到reset前的状态:
git reset --hard dev@{4}
想回复到那个位置改写日志标识即可
1、添加add
- git add -A 提交所有变化
- git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
- git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
git版本不同会有所区别:
链接:https://www.jianshu.com/p/65fb3fa62057
恢复
Git Reset 三种模式soft,mixed,hard
https://www.jianshu.com/p/c2ec5f06cf1a
https://blog.csdn.net/bandaoyu/article/details/95041985
修改已提交的commit注释
两种情况:
1.已经将代码push到远程仓库
2.还没将代码push到远程仓库,还在本地的仓库中
这两种情况下的修改大体相同,只是第一种情况最后会多一步
下面来说怎么修改
先搞清楚你要修改哪次的提交注释或者哪几次的提交注释
修改最后一次注释
如果你只想修改最后一次注释(就是最新的一次提交),那好办:git commit --amend
出现有注释的界面(你的注释应该显示在第一行), 输入i
进入修改模式,修改好注释后,按Esc
键 退出编辑模式,输入:wq
保存并退出。ok,修改完成。
例如修改时编辑界面的图:
编辑commit注释.png
修改之前的注释
修改之前的某次注释
-
输入:
git rebase -i HEAD~2
最后的数字2指的是显示到倒数第几次 比如这个输入的2就会显示倒数的两次注释(最上面两行)显示倒数两次的commit注释.png
-
你想修改哪条注释 就把哪条注释前面的
pick
换成edit
。方法就是上面说的编辑方式:i
---编辑,把pick
换成edit
---Esc
---:wq
. -
然后:(接下来的步骤Terminal会提示)
git commit --amend
-
修改注释,保存并退出后,输入:
git rebase --continue
提示输入的命令.png
其实这个原理我的理解就是先版本回退到你想修改的某次版本,然后修改当前的commit注释,然后再回到本地最新的版本
修改之前的某几次注释
修改多次的注释其实步骤和上面的一样,不同点在于:
- 同上
- 你可以将多个想修改的commit注释前面的
pick
换成edit
- 依次修改你的注释(顺序是从旧到新),Terminal基本都会提示你接下来的操作,每修改一个注释都要重复上面的3和4步,直到修改完你所选择的所有注释
已经将代码push到远程仓库
首先,你把最新的版本从远程仓库先pull下来,修改的方法都如上,最后修改完成后,强制push到远程仓库:git push --force origin master
注:很重要的一点是,你最好保证在你强制push之前没有人提交代码,如果在你push之前有人提交了新的代码到远程仓库,然后你又强制push,那么会被你的强制更新覆盖!!!
最后,可以检查一下远程的提交记录~~
链接:https://www.jianshu.com/p/098d85a58bf1
git常用操作
这是一个极为简单的git笔记,只包含相关命令
1.git安装后自报家门,姓名和邮箱
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
2.创建工作区,初始化工作区
$ pwd
/c/notos/code/gitpractice
74565@jason MINGW64 /c/notos/code/gitpractice
$ git init
Initialized empty Git repository in C:/notos/code/gitpractice/.git/
3添加新文件并添加到缓存区,并commit
$ git add readme.txt //为什么会有add commit两步骤呢,你可以添加很多次文件然后依次commit
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
74565@jason MINGW64 /c/notos/code/gitpractice (master)
$ git commit -m "create readme.txt" // -m 是对本次提交的描述,最好是有意义的
[master (root-commit) 33dd7af] create readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
4.查看git 状态
刚提交完时查询
$ git status
On branch master
nothing to commit, working directory clean
修改readme文件后
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory) //撤回修改,其实使用版本库中的版本替换工作区版本
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
add文件后
$ git status
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)//将提交到暂存区的file 撤回,相当于没有add
modified: readme.txt
5.比较工作区修改前后文件,修改未add
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
6.git查看log
$ git reflog
e47dc70 HEAD@{0}: commit: append GPL
e3c958d HEAD@{1}: commit: add distributed
33dd7af HEAD@{2}: commit (initial): create readme.txt
----------------------------------------------------------------------------
$ git log
commit e47dc706520adc55fd9de97bb911dbd8a406ab19 //commitid 每个人的都不一样
Author: jasondong <[email protected]>
Date: Mon Apr 2 10:25:45 2018 +0800
append GPL
commit e3c958de9f539e0caad6e8a2a845c60defff2940
Author: jasondong <[email protected]>
Date: Mon Apr 2 10:20:28 2018 +0800
add distributed
commit 33dd7afe64ff9e73688de94a1fc61f1b8966207d
Author: jasondong <[email protected]>
Date: Mon Apr 2 09:58:34 2018 +0800
create readme.txt
7.git版本回退
$ git reflog //版本回退需要知道commitid的前几位(前七位),所以需要先查看commitid
e47dc70 HEAD@{0}: reset: moving to e47dc70
33dd7af HEAD@{1}: reset: moving to 33dd7af
e47dc70 HEAD@{2}: commit: append GPL
e3c958d HEAD@{3}: commit: add distributed
33dd7af HEAD@{4}: commit (initial): create readme.txt
74565@jason MINGW64 /c/notos/code/gitpractice (master)
$ git reset --hard e3c958d //假如要会退到第二版本
HEAD is now at e3c958d add distributed //git 只需简单的吧指针指向老的版本即可,所以速度很快
8. 取消工作区修改,实际上使用版本库中文件替换 当前文件内容
在readme 中添加如下内容
Git is a distributed version control system.
Git is free software.
+My stupid boss still prefer to svn. //新添加内容
-----------------------------------------------------
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory) // 取消修改的命令
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout -- readme.txt
74565@jason MINGW64 /c/notos/code/gitpractice (master)
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
9.取消暂存区文件的修改
现在修改了文件,而且进行了 git add
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage) // 用这个命令即可从暂存区撤销add
modified: readme.txt
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
10.删除版本库中文件
git rm test.txt //git rm 和git add 其实是等效的,都是对暂存区的操作
git commit -m "rm test.txt"
11.添加远程仓库并push
$ git remote add origin [email protected]:jasondong-1/gitpractice.git // 添加远程仓库,一般给远程仓库命名为origin
74565@jason MINGW64 /c/notos/code/gitpractice (master)
$ git push -u origin master//第一次向远程仓库提交加 -u参数
The authenticity of host 'github.com (13.250.177.223)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,13.250.177.223' (RSA) to the list of known hosts.
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (10/10), 870 bytes | 0 bytes/s, done.
Total 10 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To [email protected]:jasondong-1/gitpractice.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
12.从远程仓库克隆
$ git clone [email protected]:jasondong-1/gitpractice.git // 后面也可再跟一个名字,即重命名git库
13.创建新的分支
$ git checkout -b dev //
Switched to a new branch 'dev'
74565@jason MINGW64 /c/notos/code/gitpractice (dev)
$ git branch //查看git下所有分支 ,*表示当前分支
* dev
master
git checkout -b dev 这条命令可以用一下两条命令替代
$ git branch dev //创建分支
$ git checkout dev //切换分支
14.合并分支
//在新分支上修改文件并提交
$ git add readme.txt
74565@jason MINGW64 /c/notos/code/gitpractice (dev)
$ git commit -m "branch test"
[dev 84a8f86] branch test
1 file changed, 1 insertion(+)
$ git checkout master //首先切换回master分支
Already on 'master'
Your branch is up-to-date with 'origin/master'.
74565@jason MINGW64 /c/notos/code/gitpractice (master)
$ git branch
dev
* master
74565@jason MINGW64 /c/notos/code/gitpractice (master)
$ git merge dev // 合并得知 分支到当前分支 git merge --no-ff -m "merge with no-ff" dev 采用非fast-forward方式合并分支
Updating 4b00677..84a8f86
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
15.删除分支
$ git branch -d dev //删除分支
Deleted branch dev (was 84a8f86).
74565@jason MINGW64 /c/notos/code/gitpractice (master)
$ git branch
* master
16.解决冲突
假如在一个新的分支上修改了readme并进行提交,master上也对readme进行了修改,而且修改的是同一行,也commit了,那么合并新分支到master时会报错
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.//自动合并失败,手动解决冲突后,重新提交
手动解决冲突航班重新提交
git add readme.txt
74565@jason MINGW64 /c/notos/code/gitpractice (master|MERGING)
$ git commit -m "fixed conflict"
[master 4cdbdc4] fixed conflict
17.查看分支合并图
$ git log --graph
18.分支策略
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
19.git stash 隐藏,必须把修改的文件进行 git add 后 才可以 gits tash
$ git stash
Saved working directory and index state WIP on dev: b5e0aa9 new file hello.txt
HEAD is now at b5e0aa9 new file hello.txt
74565@jason MINGW64 /c/notos/code/gitpractice (dev)
$ git stash list
stash@{0}: WIP on dev: b5e0aa9 new file hello.txt
74565@jason MINGW64 /c/notos/code/gitpractice (dev)
$ git stash pop
On branch dev
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (a3e21e6f0042b48f4160e886cf6f79f346f15543)
74565@jason MINGW64 /c/notos/code/gitpractice (dev)
$ git stash list
74565@jason MINGW64 /c/notos/code/gitpractice (dev)
20.git 查看远程仓库信息
$ git remote
origin
74565@jason MINGW64 /c/notos/code/gitpractice (dev)
$ git remote -v
origin [email protected]:jasondong-1/gitpractice.git (fetch)
origin [email protected]:jasondong-1/gitpractice.git (push)
21.推送分支(会推送到远端对应的分支上)
语法:$ git push <远程主机名> <本地分支名>:<远程分支名> 若省略远程分支,代表将本地当前分支推送到远端对应分支
git push origin master // 推送到远端的master
git push origin dev //推送到远端的dev
什么样的分支需要推送到远端?我认为凡是需要大家共享的分支就需要push到远端
22. 从远程仓库克隆
$ git clone [email protected]:jasondong-1/gitpractice.git //git clone 默认只会把远端的master克隆下来
$ git branch
* master
23.获取远端其他分支
$ git checkout -b dev origin/dev //现在有了对应的dev分支
$ git branch
* dev
master
24.两人同时修改了同一份文件向远端push冲突的解决
$ git push origin dev //git不知道该用哪一份文件
To [email protected]:jasondong-1/gitpractice.git
! [rejected] dev -> dev (fetch first)
error: failed to push some refs to '[email protected]:jasondong-1/gitpractice.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.// git建议push之前先pull
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
$ 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 //git pull 时报告没有tracking information,可以用这句pull
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/ dev
$ git pull origin dev
解决冲突,并重新add commit
25.git打标签(人类可以识别的标志)
git tag v0.1 33dd7af //33dd7af是commit-id
或
$ git tag -a v0.2 -m "stable edition" e47dc70
查看 tag
git tag
26.操作标签
git push origin 可以推送一个本地标签;
git push origin --tags可以推送全部未推送过的本地标签;
git tag -d 可以删除一个本地标签;
git push origin :refs/tags/可以删除一个远程标签。
27..gitignore 可以忽略.gitignore 文件中的文件
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
https://www.cnblogs.com/jason-dong/p/8848350.html
GIT 笔记三: 图片
http://pinkyjie.com/2014/08/10/git-notes-part-3/