git初期化,init之后默认的就是master分支 git init |
将远程仓库克隆到本地,init与clone都可以建立初期本地仓库 git clone |
git需要先进入git要操作的工程目录 |
origin是url的一个别名即远程仓库网址 |
cd C:/workspace/core |
.git文件夹是git的仓库文件夹 |
分支可以理解为一个文件的历史版本,切换分支就是切换到文件的某一版本。 随着checkout切换分支文件的内容也会随着变化(git会调出当前分支的最新(head)版本) 察看本地分支 git branch 在某一个commit点上切出一个分支的话,这两条线有一样的父节点所以之前的履历等信息完全一样。 |
察看远程分支,此处远程分支指的是已经下载到本地的远程分支,如果没有进行过fetch 或者pull则不会出现新的远程分支 git branch -r |
察看所有分支 git branch -a |
察看各个分支最后一次提交情况 git branch -v 如果该分支又没有提交的commit则在该分支后面显示[ahead X]X为未提交的个数 |
查看分支的merge情况,例如,如果有3个分支没有被merge过那么切换到任何一个分支上执行该命令那么看另外2个分支都是没有被合并过的状态。 git branch --merged git branch --no-merged |
删除分支 git branch -D 分支名 |
合并当前分支与指定分支,如果两个分支中修改的文件有冲突,在该文件上会显示冲突 可以快进则以快进的方式merge git merge 分支名 <<<<<<< HEAD aaa=aaaabbbbccccddd1 ======= aaa=aaaabbbbccccddd2 >>>>>>> test2 此时执行git status会显示多一种状态即有冲突的文件Unmerged paths: 修改文件解决冲突后,需要再次add,commit到本地仓库 普通的merge git merge --no-ff 分支名 快进merge git merge --ff-only 分支名 快进merge,如果从a分支切出了b分支后a分支没有进行过提交,b进行了几次commit,则当把b分支git merge到a分支时执行的是快进merge 快进merge是将两个分支直接并成一条线,不会留下merge的履历,所以不能取消此次merge,也不能回到b分支上的某次commit 普通merge,如果a分支本身也有commit则无法进行快进merge只能将a,b进行merge 在commit,普通merge会保留a,b两条线。 merge之后如果没有冲突也会有一个默认的merge的commit |
git rebase 合并两个分支 a分支切出了b分支,a,b各自有commit,b上的commit是1和2,使用rebase合并后,b分支上的cimmit1和2会被打包成1'和2',然后作为新的commit提交到a分支上之后,a,b合并成一条线。之前的commit1和2则不存在了,已经进行过push的分支不能进行rebase否则无法在进行push,因为之前已经push到远程仓库上的commit1和2,在本地变成了1'和2',此时需要强制push。 Rebase也会使两个分支上merge的commit消失 |
创建分支(创建后仍在本地,未提交远程仓库),当前分支的所有状态都会被当作新分支的初始状态,如,在当前分支上有没有add到索引区的变更,那么在新分支test上也会看到该变更。该变更可以选择提交到元分支或新建分支上。无论提交到哪个分支上最后还是要merge到一起,提交到远程仓库。 git branch test |
切换分支分支切换后,如果切换后分支有没有push的commit那么切换后会有提示 如果分支的切换时发生了修改的冲突侧除非强制切换分支,否则会提示切换会导致修改被覆盖的提示,导致无法切换。 git checkout test 回到上一次切换的分支是git checkout - 如果当前分支有修改未提交的修改会导致无法切换分支,强制切换, git checkout -f test |
分支的创建与切换一起执行 git checkout -b test2 |
察看当前分支下本地仓库的履历,包括远程仓库和本地commit后的履历,oneline是一行显示。 git log [--oneline] 408dfbc CN1对应 aa557f7 ORACLE対応 察看最近两次提交的差分 git log -p -2 察看每次提交修改的文件 git log --stat |
察看本地文件的状态 git status 状态分为以下几种 Changes not staged for commit:缓存中存在该文件,但是有变更没有被add到缓存中。 Changes to be committed:已经add到缓存中但是没有被commit到本地仓库,执行commit后这部分变更会清空。 Untracked files:没有被add到缓存区的文件 当一个文件被修改后,在本地任何一个分支上执行git status都会显示该文件修改, 当该修改被git add 之后Changes to be committed的状态只能在该分支下看到。 红色字显示的是没有进行add的文件,绿色自显示的是没有进行commit的文件。 一旦进行commit之后,status的状态会被清空,要想察看没有被push的文件 |
比较文件差异(工作区和缓存区的差异),这里是在缓存区没有被提交的差异,不是最近一次提交后所有的差异 git diff [文件路径] 不加路径的话显示所有文件差异 git diff --staged 缓存区最近一次提交于之前的差异,这个差异没有被提交到本地仓库,用于commit时确认要commit的内容,commit执行只后,之前git diff --staged里表示的差异会被清空。 |
忽略某些文件,如果有些文件如log编译文件等会自动发生变化,在执行status或diff时不想每次都出现这样的文件的话,可以忽略该文件。 cat .gitignore *.[log] |
提交文件 git add 文件路径 git add . Add所有变更的文件 git commit -m [commont] 文件路径 git commit -m [commont] . 提交所有文件 如果在本地很多分支上作了文件的修改,则commit时所在的分支决定了哪个分支上会显示履历 将本地文件提交到远程仓库需要以下3步 workingtree(工作区)上执行add->index(缓存区)上执行commit->history(历史记录区/本地仓库)上执行 push->远程仓库 与之相应的可以撤销以上操作add 是用checkout撤销,commit是用reset撤销 提交文件有3种流程 1。用add 文件1文件2 文件3先将要提交的文件汇总到索引上变成准备提交的状态在执行一次commit将索引上准备提交的文件提交到本地仓库 2。用commit 文件1 文件2来指定索引上需要提交的文件 3。工作区的所有变更add 和commit同时执行 git commit -am "競合解決" commit之后被合并的分支上所有的commit履历也都会跟着合并到当前分支上 |
HEAD最新的一次提交 head~1,head~2,head~3等,代表的是本分支上的commit履历,不包括其他分支合并过来的履历,(合并两个分支时被合并的分支上的commit履历也会一起合并过来),a,bmerge之后a上能看到b1-b3,但是a上的head不包括b1-b3 a0--a1--a2------a3 | | b1------b2--b3 ORIG_HEAD服务器上最新的一次提交 FETCH_HEAD执行fetch后取下来的远程仓库的最新一次提交 MERGE_HEAD两个分支合并以后<branch-name>分支的最新一次提交git merge <branch-name> |
git diff 显示工作目录与索引文件之间的差异 git diff 文件路径 显示工作目录中单个文件与索引区的差异 git diff --cached显示索引文件与git仓库之间的差异 git diff HEAD 显示工作目录与git仓库之间的差异 git diff head --name-only只显示文件名 git diff branch1 origin/branch1 比较本地分支和远程分支区别 git status 显示当前branch状态 如果当前分支有没有push到远程仓库的commit则会显示 Your branch is ahead of 'origin/feature-EncryptComponent' by 5 commits. git status各种状态 Changes to be committed 已经提交到索引区等待commit的文件(下面文件分为new file和modified) Changes not staged for commit: 文件有改修没有被add到索引区 Untracked files: 新规追加的文件没有被add到索引区 git log 显示当前分支所有commit履历 git show 显示一次commit提交的内容 察看head 当前分支中最新的一次提交叫做head,head同时也指出了当前的位置,在哪一个分支上。 察看当前分支已经commit到本地仓库但是没有被push到远程的变更 git show [head] 察看最新倒数第二次的提交 git show head^ 察看最新倒数第三次的提交 git show head^^或者git show head~2 察看指定的commit git show commitid 查看所有分支的commit情况,可以看到每次提交都是在那个分支上进行的,!表示所在分支的head,*表示当前分支,-是merge,+普通的commit git show-branch ! [develop] XXX修正 #111 ! [feature-#229] reset the value ! [master] XXX修正 #111 * [test] new function ! [test2] hotfix ----- * [test] new function + [test2] hotfix + [feature-#229] reset the value + *+ [test^] 作成 + *+ [test~2] 追加 + *+ [test~3] 修正 + *+ [test~4] 修正212 + *+ [test~5] 修正212 + *+ [test~6] 修正 + *+ [test~7] 修正 #212 + *+ [test~8] 修正 #212 + *+ [test~9] XX完了 +++*+ [develop] XXX修正 #111 |
tracking branch 为了追踪远程分支在本地建立的分支 remote branch 远程分支 local branch 本地分支 |
git fetch [origin] 将远程他人分支反映到本地的跟踪分支上,包括更新已经有的分支和下载新的分支 3036acc..9eb5e40 debian-release-20081030 -> origin/debian-release-20081030 * [new branch] debian-release-20081112 -> origin/debian-release-20081112 |
git merge [origin/debian-release-20081112] 将本地的跟踪分支合并到本地分支上 |
再用checkout debian-release-20081112进入这个新分支,执行过checkout后才能在branch命令中看到新分支 |
或者在fetch之后,在本地建立同名分支,进入该分支之后再进行merge 本地建立同名分支develop,由于没有merge所以develop分支履历与master一致 git branch -v * develop 87381ae 依存注入 master 87381ae 依存注入 merge之后develop的履历变成了远程分支的履历 git branch -v * develop 0e55fc3 ORACLE对应 master 87381ae 依存注入 |
用pull操作来更新远程分支,相当于fetch与merge在一起执行 git pull origin master git checkout develop git branch -v * develop 0e55fc3 ORACLE对应 master 87381ae 依存注入 develop分支已经是远程分支的履历 |
git revert commitid 为了取消某次commit的commit |
rebase -i |
git reset --hard commitid 完全恢复到某次commitid时的状态 如果有其他分支branchother是从当前分支的head切出来的场合,当当前分支reset 历史履历的某一点后其他分支的履历不发生变化,即当前分支后退了,branchother还保持着以前的状态。 git reset --hard 撤消本地的操作, |
git reset --hard commitid 撤销一次提交,完全删除一次提交,该提交的变更从本地仓库,索引区,工作目录完全删除。 Git rest --soft commitid 撤销一次提交,只是从本地仓库撤销,索引区和工作目录保留,针对该提交的变更进行编辑可以再次进行提交。 Git reset commitid 撤销一次提交,从本地仓库和,索引区撤销,保留工作区。 |
git checkout -- file 撤销某个文件的修改,恢复到仓库或者索引区的状态。 |
将本地分支推送到远程仓库 git push origin test 删除远程分支 git push origin :test 提交本地test分支作为远程的master分支 git push origin test:master |
察看改修进程的履历,依次为worktree变化,索引区变化,本地仓库变化 git status, git diff, git diff --cached, git show head |
如果想撤销已经推送到远程的分支上的一些commit,可以先删除远程分支,在回退本地分支版本,在从新把本地分支推送到远程。 Git push origin :branch git reset --hard commitid 这一步不会将已经推送到远程的分支回退所以要先删除远程在重新推送。 git push origin branch |
修改上一次,提交时的commant git commit --amend 进入vim编辑器 然后连打两个大写Z推出编辑器。 |
例子 本来应该在develop上切分支feature2进行新作业,吴操作从另外一个feature1上切了分支,而f1上有没有merge到develop上的变更,这样就带到了f2上,而将f2进行merge时不应该有这些f1上的变更,并且pullrequest时也将f1的变更显示了出来。 解决:让f1线进行merge到develop,f2在本地更新develop再将这些更新merge到f2上,这样f1变更的新版本文件就会覆盖到f2上,并且不会冲突,因为develop上的新版本的父节点和f2一致。在将f2push到远程这样远程的f2就不会显示f1的更新。 |
撤销远程push,先reset本地到一个历史commit id,在强制push到远程,git push -f origin feature-test |
更新develop后再merge到作业分支,如果没有净合的话在工作分支上则会有一个自动merge的commit,如果有净合则需要解决净合后手动进行commit。 此时只要有一个文件有净合,其他所有从develop merge过来的文件都需要手动commit。 |
git remote -v 察看远程url ----------------------- git stash git stash pop
git gui
查看树行结构, gitk 查看某个文件的树型历史. gitk XXX git branch -r 看到的只是下载到本地的远程分支,要看所有远程分支先要git fetch一下 ------------------------- 撤回已经push的提交revert 要撤回的hashID 撤回之后需要再进行一次push,push的是本次撤回的这个操作动作 ------------------------- git stash |
git 命令总结
最新推荐文章于 2023-12-14 11:13:00 发布