Andy Niu Help
1.0.0.0
|
变量 | |
git远程分支的删除和同步 | |
git忽略文件权限的检查 | |
本地创建分支,并和远程关联 | |
svn与git对照 | |
log命令 | |
冲突的情况只有两种 | |
我们的开发分支管理 | |
push可能会有冲突 | |
看看fetch做了什么事情 | |
是不是只能merge提交的分支 | |
本地的修改状态 | |
push命令 | |
git命令status | |
git撤销修改 | |
撤销本地修改 | |
详细描述
变量说明
git命令status |
1、执行的结果如下: niuzibin@ubuntu:~/work/gittest$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: readme.txt Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt 2、解释如下: On branch master 工作的分支 Changes to be committed: 暂存区没有提交的信息 Changes not staged for commit: 工作区没有添加到暂存区的信息
git忽略文件权限的检查 |
1、git config core.fileMode false 2、可以查看配置文件 niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true
- 参见
git撤销修改 |
1、分为两种情况: 第一种情况,工作区做了修改,还没有添加到暂存区。 第二种情况,工作区做了修改,并且已经添加到暂存区,然后工作区又做了修改。 2、对于第一种情况,直接使用checkout即可。如下: niuzibin@ubuntu:~/work/gittest$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a") niuzibin@ubuntu:~/work/gittest$ git diff diff --git a/readme.txt b/readme.txt index 4dd9cb5..56b6b46 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1 @@ -I am Andy +I am Bill niuzibin@ubuntu:~/work/gittest$ git checkout readme.txt niuzibin@ubuntu:~/work/gittest$ git status On branch master nothing to commit, working directory clean niuzibin@ubuntu:~/work/gittest$ git diff 3、对于第二种情况,版本库是 I am Andy,暂存区是 I am Bill, 工作区是 I am Caroline,如下: // 比较暂存区和版本库的差别 niuzibin@ubuntu:~/work/gittest$ git diff --cached diff --git a/readme.txt b/readme.txt index 4dd9cb5..56b6b46 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1 @@ -I am Andy +I am Bill // 比较工作区和暂存区的差别 niuzibin@ubuntu:~/work/gittest$ git diff diff --git a/readme.txt b/readme.txt index 56b6b46..b688830 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1 @@ -I am Bill +I am Caroline // 比较工作区和版本库的差别 niuzibin@ubuntu:~/work/gittest$ git diff HEAD diff --git a/readme.txt b/readme.txt index 4dd9cb5..b688830 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1 @@ -I am Andy +I am Caroline 4、撤销工作区的修改,如下: niuzibin@ubuntu:~/work/gittest$ git checkout readme.txt niuzibin@ubuntu:~/work/gittest$ git diff --cached diff --git a/readme.txt b/readme.txt index 4dd9cb5..56b6b46 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1 @@ -I am Andy +I am Bill niuzibin@ubuntu:~/work/gittest$ git diff niuzibin@ubuntu:~/work/gittest$ git diff HEAD diff --git a/readme.txt b/readme.txt index 4dd9cb5..56b6b46 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1 @@ -I am Andy +I am Bill 5、撤销暂存区的修改,如下: niuzibin@ubuntu:~/work/gittest$ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt niuzibin@ubuntu:~/work/gittest$ git diff --cached niuzibin@ubuntu:~/work/gittest$ git diff diff --git a/readme.txt b/readme.txt index 4dd9cb5..56b6b46 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1 @@ -I am Andy +I am Bill 6、还需要再次checkout,如下: niuzibin@ubuntu:~/work/gittest$ git checkout readme.txt niuzibin@ubuntu:~/work/gittest$ git diff --cached niuzibin@ubuntu:~/work/gittest$ git diff 7、也就是说,checkout相当于拿暂存区的数据,覆盖工作区。reset HEAD相当于拿版本库的数据,覆盖暂存区。 8、考虑工作区、暂存区、版本库的内容分别为C、B、A 现在要全部撤销,有两个办法: 第一个办法:checkout结果为【B、B、A】-->reset HEAD结果为【B、A、A】-->checkout结果为【A、A、A】 第二个办法:reset HEAD结果为【C、A、A】-->checkout结果为【A、A、A】
git远程分支的删除和同步 |
1、其他人已经删除某个分支,但是本地还能看到,这个时候fetch报错,如下: niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ git branch -a develop * niuzibin remotes/origin/HEAD -> origin/develop remotes/origin/chenming remotes/origin/develop remotes/origin/heming remotes/origin/master remotes/origin/niuzibin remotes/origin/patch-1 remotes/origin/patch-2 remotes/origin/patch-3 remotes/origin/patch-4 remotes/origin/revert-77cdc6fe remotes/origin/revert-fa155359 remotes/origin/tuchengyu remotes/origin/tuchengyu2 remotes/origin/yangyang remotes/origin/yogurt remotes/origin/ywn niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ sudo git fetch origin tuchengyu fatal: Couldn't find remote ref tuchengyu Unexpected end of command stream 2、这个错误的原因是,fetch已经删除的分支 3、如何同步呢? 执行 git fetch -p,如下: From https://192.168.10.99/FLKDBEnc/FLKCDP x [deleted] (none) -> origin/patch-2 x [deleted] (none) -> origin/patch-3 x [deleted] (none) -> origin/patch-4 x [deleted] (none) -> origin/tuchengyu 这个时候 git branch -a,就会少一些分支 4、查看分支的关联,如下: niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ git branch -vv develop 0c0c9a2 [origin/develop: behind 119] Merge branch 'chenming' into 'develop' * niuzibin 4463d6a [origin/niuzibin] 删除无用的方法
- 参见
log命令 |
1、显示log git log 2、显示最近的两次提交log git log -2 3、显示每次提交的内容差异 git log -2 -p 4、显示某个文件的内容差异 git log -2 -p .gitignore 5、也可以通过show,显示某一个提交的内容差异,如下: root@ubuntu:/home/disk1/GitTest# git log -1 -p .gitignore commit 12fdff5b6cd259cff2952fce978f1555635d4bfc Author: nzbbody <[email protected]> Date: Wed Jun 6 10:27:04 2018 +0800 增加忽略的文件 diff --git a/.gitignore b/.gitignore index 259148f..645ee14 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ *.exe *.out *.app + +# Other temp file +*.bak root@ubuntu:/home/disk1/GitTest# git show 12fdff5b6cd259cff2952fce978f1555635d4bfc .gitignore commit 12fdff5b6cd259cff2952fce978f1555635d4bfc Author: nzbbody <[email protected]> Date: Wed Jun 6 10:27:04 2018 +0800 增加忽略的文件 diff --git a/.gitignore b/.gitignore index 259148f..645ee14 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ *.exe *.out *.app + +# Other temp file +*.bak
push可能会有冲突 |
1、甲修改,commit push 2、乙修改,commit push,报错 To https://github.com/nzbbody/GitTest ! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://github.com/nzbbody/GitTest' 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. 3、提示,在push之前,先pull一下。我们使用fetch + merge 4、执行 git fetch origin master git merge origin/master 5、merge有冲突,需要解决冲突,add commit push root@ubuntu:/home/disk1/GitTest# git add readme.txt root@ubuntu:/home/disk1/GitTest# git commit -m"333444" root@ubuntu:/home/disk1/GitTest# git push origin master:master
push命令 |
1、git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相似。 git push <远程主机名> <本地分支名>:<远程分支名> 2、git push origin master 上面命令表示,将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。
svn与git对照 |
1、svn是集中式,git是分布式 2、svn保存文件的差异,git保存文件的快照,如果没有变化,从上一次引用下来,对于修改的文件,做一个副本,也就是写时拷贝(COW) 3、svn创建分支,相当于整体拷贝,git创建分支,在任意一个提交点(commit point)开启分支
冲突的情况只有两种 |
1、两个分支都提交了,然后merge时 办法是:解决冲突+add+commit 2、push的时候,其实也是两个分支都提交了,需要merge 办法是:解决冲突+add+commit+push 3、你可能会想,master改了,提交。test1改了,先把master分支merge到test1,然后add commit,存在冲突。 这种情况是不存在的。因为:test1修改了,没有提交的情况下,是不能merge的。
我们的开发分支管理 |
1、远程有develop和niuzibin,在gitlab执行 merge niuzibin-->develop 2、我的本地有 niuzibin,注意:本地的develop没有意义 本地的niuzibin分支,push到 origin/niuzibin 3、我在本地修改 niuzibin分支, 4、然后add commit, 5、从origin/develop进行fetch,然后merge,有冲突,解决冲突,再次add commit push 6、注意:4和5是不能颠倒顺序的,本地有修改,必须先提交,再merge
撤销本地修改 |
1、准备工作如下: niuzibin@ubuntu:~/work/gittest$ git init Initialized empty Git repository in /home/niuzibin/work/gittest/.git/ niuzibin@ubuntu:~/work/gittest$ git config --global user.name "niuzibin" niuzibin@ubuntu:~/work/gittest$ git config --global user.email "[email protected]" niuzibin@ubuntu:~/work/gittest$ git config user.name niuzibin niuzibin@ubuntu:~/work/gittest$ git config user.email [email protected] niuzibin@ubuntu:~/work/gittest$ vi readme.txt niuzibin@ubuntu:~/work/gittest$ git add readme.txt niuzibin@ubuntu:~/work/gittest$ git commit -m"add file readme.txt" [master (root-commit) 7846ec0] add file readme.txt 1 file changed, 1 insertion(+) create mode 100644 readme.txt niuzibin@ubuntu:~/work/gittest$ git log commit 7846ec02be0f61138d84b75aa5213c9f4421d4b4 Author: niuzibin <[email protected]> Date: Mon Apr 9 18:29:47 2018 -0700 add file readme.txt 2、注意:提交的时候,如果没有-m写日志,会提示输入日志。输入之后,Ctrl+o,然后Enter,然后Ctrl+x 3、修改,查看变化 niuzibin@ubuntu:~/work/gittest$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt Untracked files: (use "git add <file>..." to include in what will be committed) 1 no changes added to commit (use "git add" and/or "git commit -a") niuzibin@ubuntu:~/work/gittest$ git diff diff --git a/readme.txt b/readme.txt index 4dd9cb5..3f54eb5 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1,2 @@ I am Andy +hehe 4、撤销本地修改 niuzibin@ubuntu:~/work/gittest$ git checkout -- readme.txt 5、上面的方法撤销一个文件的修改,如果撤销当前目录下的多个文件修改,使用 niuzibin@ubuntu:~/work/gittest$ git checkout ./
是不是只能merge提交的分支 |
1、创建test1分支,修改文件,add、commit 2、转到master分支,也修改文件,这个是时候,diff test1 master,看到的是提交的差异 注意:diff比较分支,是比较已经提交的分支。 3、先不提交,merge试一下,报错 error: Your local changes to the following files would be overwritten by merge: readme.txt Please, commit your changes or stash them before you can merge. Aborting 4、提示:要求提交之后,再merge,如下: root@ubuntu:/home/disk1/GitTest# git add readme.txt root@ubuntu:/home/disk1/GitTest# git commit -m"master" [master 217992a] master 1 file changed, 1 insertion(+) root@ubuntu:/home/disk1/GitTest# git merge test1 Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result. 5、这个时候,merge有冲突,需要解决冲突 解决冲突,然后再进行 add、commit 6、结论: 当前分支修改后不提交,merge报错,要求先提交,再merge 提交后再merge,可能会冲突,需要解决冲突,然后add commit
本地创建分支,并和远程关联 |
1、示例如下: niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ git branch -a * develop niuzibin remotes/origin/HEAD -> origin/develop remotes/origin/chenming remotes/origin/develop remotes/origin/heming remotes/origin/master remotes/origin/niuzibin remotes/origin/patch-1 remotes/origin/revert-77cdc6fe remotes/origin/revert-fa155359 remotes/origin/tuchengyu2 remotes/origin/yangyang remotes/origin/yogurt remotes/origin/ywn remotes/origin/ywn1 niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ git branch tuchengyu2 niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ git branch -vv * develop dc5f079 [origin/develop] Merge branch 'yangyang' into 'develop' niuzibin 4463d6a [origin/niuzibin] 删除无用的方法 tuchengyu2 dc5f079 Merge branch 'yangyang' into 'develop' niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ git branch --set-upstream-to origin/tuchengyu2 tuchengyu2 Branch tuchengyu2 set up to track remote branch tuchengyu2 from origin. niuzibin@ubuntu:~/work/FLKDBEnc/FLKCDP$ git branch -vv * develop dc5f079 [origin/develop] Merge branch 'yangyang' into 'develop' niuzibin 4463d6a [origin/niuzibin] 删除无用的方法 tuchengyu2 dc5f079 [origin/tuchengyu2: behind 14] Merge branch 'yangyang' into 'develop'
- 参见
本地的修改状态 |
工作区----【add】------->暂存区----【commit】-------->版本库 工作区<---【checkout】---暂存区<---【reset HEAD】-----版本库
看看fetch做了什么事情 |
1、git fetch origin master,通过fetch前后的文本对照和抓包,发现 fetch会获取远程分支的commit id,也就是本地的文件FETCH_HEAD,以及远程 origin/master的最新文件内容 2、然后merge origin/master,会合并 origin/master 到 merge 也就是说,merge origin/master 并没有网络传输 3、git pull origin master = git fetch origin master + merge origin/master 但是,一般不要使用pull,在背后进行merge总是不好的。
Copyright (c) 2015~2016, Andy Niu @All rights reserved. By Andy Niu Edit.