①Workspace:工作区
②Index / Stage:暂存区
③Repository:仓库区(或本地仓库)
④Remote:远程仓库
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
git config --global --list 查看邮箱配置
git init
①创建本地分支
//新创建的分支名字experimental
git branch experimental
②查看本地分支列表
git branch
//加上 -r 参数 显示远端分支。
//加上 -a 参数,同时显示远端和本地分支。
//运行结果如下
experimental
* master
//“experimental” 分支是你刚才创建的,“master”分支是Git系统默认创建的主分支。星号(“*”)标识了你当工作在哪个分支下
③切换分支:
//切换到”experimental”分支
git checkout experimental
④同時建立分支和切換
//在 checkout 命令给定 -b 参数执行,可以同時建立分支和切換。
git checkout -b
⑤删除分支
//删除掉你的 “experimental” 分支
git branch -d experimental
⑥合并分支
git merge
git add . 添加当前文件夹下的所有文件
git add 文件夹加 后缀名
git add common/ main/
//我们用的比较多的应该就是-m 参数。添加提交信息。 双引号中是提交内容的注释
git commit -m "fix titlebar show or hide"
//会用一个新的 commit 更新并替换最近的 commit ,这个新的 commit 会把任何修改内容和上一个 // commit 的内容结合起来。如果当前没有提出任何修改,这个操作就
//只会把上次的 commit 消息重写一 遍。
git commit --amend
git commit --amend 这个命令就比较优秀了。经过个人的探索,我总结了它的两个功能
①可以修改上一次的提交信息。
②可以将最近的修改追加到上一次的提交上
③执行上面的命令,进入到vim 编辑器 , 你会发现编辑器里你怎么输入都没反应,这是因为vim 处在不可编辑状态.
windows操作: 按下字母键 c(此时进入编辑状态),可以开始修改注释信息了,修改好 后,你会发现怎么都退出不了,然后如下操作:按下Esc (退出编辑状态), 接着shif +: 然后输入wq (保存编辑),再按回车,退出vim!
LINUX操作:进入之后直接可以进行编辑,编辑完成ctrl +x ,提示按y .直接保存退出vim.
git status
git diff readme.txt
//使用 git diff 命令再加上 --cached 参数 ,看看哪些文件将被提交(commit)。
git diff --cached
git log
commit 44bcf89262a5e85611d487093011d663b15fecf9 (HEAD -> xxxx, origin/xxxx)
Author: xxx
Date: Mon Mar 23 15:24:43 2020 +0800
update version 1.0.82
Change-Id: I8e83b43b41b7ec99528b74b7b31f67ed2060aa33
$ git log --pretty=oneline
44bcf89262a5e85611d487093011d663b15fecf9 (HEAD -> xxxx, origin/xxx) update version 1.0.82
a6c1d3c2bb4f21130450bba361e322213a155a6a bug animation
e94e76f26dd09725b08d81e7e553049756e7afe9 Add Swiping dead zone bottom of camera app
例如执行 git reset --hard HEAD~1,退回到上一个版本,用git log则是看不出来被删除的commitid,用git reflog则可以看到被 删除的commitid,我们就可以买后悔药,恢复到被删除的那个版本。
$ git log --pretty=oneline
44bcf89262a5e85611d487093011d663b15fecf9 (HEAD -> xxxx, origin/xxxx) update version 1.0.82
a6c1d3c2bb4f21130450bba361e322213a155a6a bug animation
e94e76f26dd09725b08d81e7e553049756e7afe9 Add Swiping dead zone bottom of camera app
5f069149a4e80c2ed4050229f2fc2aca90e57f12 Back button in Settings needs to have a touch-down plate
$ git reflog
44bcf89 (HEAD -> xxxx, origin/xxxx) HEAD@{0}: reset: moving to 44bcf89262a5e85611d487093011d663b15fecf9
30580aa HEAD@{1}: cherry-pick: Talk back does will announce when zoomed
场景: 你在本地commit 了一些东西(还没有 push),但是所有这些东西都很糟糕,你希望撤销 前面的三次提交 ,就像它们从来没有发生过一样。
//回退到上一个版本;
git reset --hard HEAD~1
//回退到某一个版本号,last_commit_id就是commit id也就是可以从git log 拿到
git reset --hard last_commit_id
你已经执行了 git push
, 把你的修改发送到了远程仓库,现在你意识到这些 commit 的其中一个是有问题的,你需要撤销那一 个 commit。(最重要的一点:revert 是回滚某个 commit ,不是回滚“到”某个commit 也就是说 回滚的目标版本之后的提交是不会受到影响的 )
//使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:
//(1)反做,使用“git revert -n 版本号”命令。如下命令,我们反做版本号为8b89621的版本:
git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb98611
// 注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名。
//(2)提交,使用“git commit -m 版本名”,如:
git commit -m "revert add text.txt"
默认情况下, git stash 命令会把以下修改存储到一个新的堆栈中。堆栈中的内容(stash)可以被所有分支访问。
也就是说,默认情况下,git stash 命令不会存储下列文件。
如果你还想要存储 untracked files,可以使用 -u 选项。
git stash -u
如果你想要在 git stash 时,添加一个 message 注解,可以使用 save 选项。
git stash save "备注信息"
执行 git stash 命令后,工作区就恢复到了上一次 git commit 时的状态。具体表现为:
这样工作区就干净多了。使用 git diff 和 git diff --cached 也看不到工作区和暂存区中的修改了。因为它们都被存储到了一个堆栈中。
然后,我们就可以新建分支,切换到新的分支来处理其他的需求.
git stash save -u "备注信息"
# 堆栈中可能会有多个 stash,通过 stash_id 进行区分
git stash list
git stash show
git stash show stash@{id}
git stash show -p
# 将堆栈中的指定 stash 应用到工作区(保留堆栈的内容)
git stash apply stash@{id}
# 将堆栈中的最近一次 stash,应用到工作区(保留堆栈的内容)
git stash apply
# 等价于上面的一条命令
git stash apply stash@{0}
既然是堆栈,那么就遵循『先进后出』。也就是说,如果 git stash 了多次,最近一次存储会位于堆栈的顶部(stash_id 为 0),它会被优先读取。
如果你想在成功应用了堆栈的 stash 后,立即将其从堆栈中删除。可以使用 git stash pop 命令。
# 将堆栈中的最近一次 stash,应用到工作区(删除堆栈的内容)
git stash pop
# 删除指定的 stash
git stash drop stash@{id}
# 删除最近一次的 stash
git stash drop
# 删除所有的 stash
git stash clear
比如,你在本地版本库的 dev 分支,开发某个需求,但是你只完成了一半,你又不想把它 git commit 提交到版本库,也就是说工作区或者暂存区中有一些你并不想提交到版本库的代码。这时,你又接到了另外一个需求,急需进行开发。你就可以使用 git stash 来解决这个问题。
首先,将工作区和暂存区中的修改,存储到堆栈。
git stash save -u "需求 a 只完成了一半"
这样,工作区和暂存区就都干净了。可以使用下面的命令进行检测。
D:\phpStudy\WWW\private-demo (dev)
$git diff
D:\phpStudy\WWW\private-demo (dev)
$git diff --cached
查看堆栈中的 stash 列表。(由于我们只 git stash 存储了一次,故堆栈中只有一个 stash)
λ git stash list
stash@{0}: On dev: 需求 a 只完成了一半
D:\phpStudy\WWW\private-demo (dev)
git stash show
a.php | 2 ++
b.php | 3 ++-
2 files changed, 4 insertions(+), 1 deletion(-)
然后,就可以在当前的 dev 分支中,优先完成需求 b。
如果需求 b 已开发完成,就将其提交到版本库。
D:\phpStudy\WWW\private-demo (dev)
git add .
git commit -m "需求 b 已完成"
如果需求 b 需要优先上线,就推送到远程仓库。
# 保持 dev 分支有 master 分支的最新代码
git pull origin master
# 推送到远程的 dev 分支
git push origin dev
git stash pop
继续完成需求 a 中未完成的工作。
如果需求 a 也完成了,也将其提交到版本库。
总结: 实际开发过程中,经常会遇到多个需求交叉开发的情况。可以用 git stash 堆栈来解决这个问题。当然,如果你对 git stash 掌握不好,也可以创建多个分支来解决。
①git checkout -- readme.txt 意思就是把readne.txt文件在工作区域的修改全部撤销,把readme.txt从HEDA中迁出。
② git checkout. 这条命令把当前目录所有修改的文件从HEAD中签出并且把它恢复成未修改时的样子。注意使用git checkout. 时如果对应的文件被修改过。那么该修改会被覆盖掉。
③ git reset HEAD --
作用:用于将本地分支的更新推送到远程主机
语法:git push <远程主机名> <本地分支名>:<远程分支名>
例子:
git push origin master:master
//注意:这里的:前后是必须没有空格的,git pull是<远程分支>:<本地分支>, git push是<本地分支>:<远程//分支>
git push origin master
//上述命令省略了远程分支名,表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远//程分支不存在,则会被新建。
git push origin :refs/for/master
//上述命令省略了本地分支名,表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,相当
//于执行git push origin --delete master命令,表示删除origin主机的master分支。
git push origin
//上述命令表示,将当前分支推送到origin主机的对应分支。如果当前分支与远程分支之间存在追踪关系,则本
//地分支名和远程分支名都可以省略。
git push
//如果当前分支只有一个远程分支,那么主机名都可以省略,可以使用git branch -r查看远程的分支名。
git push -u origin master
//如果当前分支与多个主机存在追踪关系,则可以使用-u参数指定一个默认主机,以后就可以直接使用git push
//命令了。
平时开发中常用的提交命令
git push origin HEAD:refs/for/master
字段说明:
git push 肯定是推送。
origin : 是远程的库的名字。
HEAD: 是一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名。git这样就可以知道你工作在哪个分支
refs/for :意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的
refs/heads 不需要
执行如下命令:
$ ssh-keygen
接着会提示以下内容,在必要的地方输入想要設定的验证密码,並按 『Enter 』键确认。
如果沒有要设定验证密码,請不要輸入任何文字,直接輸入『 Enter』 鍵即可。
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/eguchi/.ssh/id_rsa): <輸入 Enter 鍵>
Created directory '/Users/eguchi/.ssh'.
Enter passphrase (empty for no passphrase): <輸入驗證密碼>
Enter same passphrase again: <再輸入一次同樣的驗證密碼>
Your identification has been saved in /Users/eguchi/.ssh/id_rsa.
Your public key has been saved in /Users/eguchi/.ssh/id_rsa.pub.
The key fingerprint is:
57:15:3c:ca:f2:dc:27:6d:c2:9a:88:d0:70:cf:8d:31 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| .o. |
| .o |
| ... . |
| . . E.o |
| +So.O o . |
| . ..+ + = +|
| . . . o = |
| . . o |
| |
+-----------------+
执行下列命令就会生成SSH公开密钥。
$ cat ~/.ssh/id_rsa.pub
输出示例如下
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDkkJvxyDVh9a+zH1f7ZQq/JEI79dVjDSG
4RzttQwfK+sgWEr0aAgfnxdxQeDKxIxqI1SwyTY8oCcWzvpORuPqwbc7UWWPcCvbQ3jlEdN
5jvwKM82hincEWwI3wzcnVg2Mn8dH86b5m6REDzwRgozQ3lqrgwGVlTvkHDFs6H0b/1PSrM
XGppOP/QXGEVhZ6Hy4m3b1wMjjrbYwmWIeYklgoGHyrldhAaDYc33y7aUcRyFyq5DubtsLn
2oj4K+1q36iviCHxCOri0FDmn2dzylRCI4S+A2/P7Y7rVfdT+8OWYKCBUs8lfjujghEtejq
Qmj9ikyGTEAW1zQCN7hVwYdjL.....
使用方法及其作用:
cherry-pick 命令可以从其他的分支复制指定的提交,然后进入到现在在的分支。
git cherry-pick commitid
cherry-pick 过程中也是可能会产生冲突的,解决冲突后先 add,然后使用 git cherry-pick--continue
。如果想放弃 cherry-pick,使用 git cherry-pick --abort
克隆项目可以直接使用 克隆地址加上 -b 加上分支;
git clone 克隆地址 -b 分支名
git show 253754448cff22e94ce4989a7fc816a9ee0b5339 show 后面是commit id
①git fetch
和 git pull
的区别
在执行 git pull
后,代码会自动 merge 到本地的分支中,而 git fetch
会忽略掉这个 merge 操作,因此简单来说:
git pull = git fetch + git merge
②git pull
和 git pull --rebase
区别
git pull
命令默认包含了一个 --merge
参数,因此二者的区别其实就是 merge
和 rebase
的区别。
merge
merge
会创建一个新的 commit,如果合并时遇到了冲突,需要解决冲突后重新 commit。
rebase
rebase
会将两个分支进行合并,同时合并之前的 commit 历史。如果出现冲突,解决冲突后执行以下命令即可:
git add
git rebase --continue
Git 提供了两种补丁方案,一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。 .diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。 .patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件。
1.1 找到commit id
在生成补丁文件前,一般要通过git log命令找到commit id,如果下图所示:
1.2 创建.patch 文件(git format-patch) 的常用命令行
1.2.1某次提交(含)之前的几次提交,n指从sha1 id对应的commit开始算起之前n个提交。
格式:git format-patch 【commit sha1 id】-n
git format-patch c3e543fd0c64b46406078a6d1ed63948ba50a62e -2
1.2.2某一笔提交的patch
格式:git format-patch 【commit sha1 id】 -1
git format-patch c3e543fd0c64b46406078a6d1ed63948ba50a62e -1
1.2.3某两次提交之间的所有patch
格式:git format-patch 【commit sha1 id】..【commit sha1 id】
git format-patch 2a2fb4539925bfa4a141fe492d9828d030f7c8a8..89aebfcc73bdac8054be1a242598610d8ed5f3c8
1.3生成diff文件常用命令
1.3.1某两笔(包前包后)提交之间的所有提交
格式:git diff commitID1 commitID2 > patch.diff
git diff c3e543fd0c64b46406078a6d1ed63948ba50a62e fe1b5f9f5b8f750595861cd46a586a7afd9cab04 > test.diff
1.3.2将单个文件做成一个单独的补丁
格式:git diff testFile > patch
1.3.3将工作区与版本库的差异做成补丁
格式:git diff --HEAD > patch
1.3.4将暂存区与版本库的差异做成补丁
格式:git diff --cached > patch
2.1检查patch/diff是否能正常打入
git apply --check file.patch文件
//或:
git apply --check file.diff文件
2.2打入patch/diff
git apply file.patch文件
//或:
git apply file.diff文件
合入patch 时出现了报错解决如下:git apply --reject file.patch这个命令会自动合入不冲突的代码,然后保留冲突的部分,同时会生成后缀为.rej的文件,用于保存没有合并进去的部分,可以参考这个进行冲突解决。解决完冲突后,删除后缀为.rej文件,并执行git add . 添加改动到暂存区最后执行git am --resolved或者git am --continue
备注:在打入patch冲突时,可以执行git am --skip跳过此次冲突,也可以执行git am --abort回退打入patch的动作,还原到操作前状态。