git操作备忘

1、配置用户信息:

git config --global user.name xxx
git config --global user.email [email protected]

其实就是在~/.gitconfig里面修改效果一样:
[user]
name = xxx
email = [email protected]

2、git 中文文件名乱码处理:

git config core.quotepath false
core.quotepath设置为false的话,就不会对0x80以上的字符进行quote,中文显示正常。

3 本地分支与远程分支:

远程分支(remote branch)是对远程仓库中的分支的索引。它们是一些无法移动的本地分支;只有在Git 进行网络交互时才会更新。远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置。
本地分支即在本机上建立的分支,开发时本地修改.本地分支与远程分支是两种平行存在的分支,远程与本地分支可以有相同的分支名。

4、Git 更新远程所有分支信息

如果安装了git客户端,直接选择fetch一下,就可以获取到了。
如果用命令行,运行 git fetch,可以将远程分支信息获取到本地,再运行 git checkout -b local-branchname origin/remote_branchname 就可以将远程分支映射到本地命名为local-branchname 的一分支。

5、新建分支,并且切换到对应分支:

git checkout -b  ipc origin/ipc

5、切换到指定的分支:

git checkout ipc

6、git删除/添加/查看新的远端仓库:

git remote rm origin  (删除)
git remote add origin [email protected]:Liutos/foobar.git (添加)
git remote -v  (查看)

8、拉取/推送远端仓库注意项:

注意:git push与git pull一定要带完整的分支。要不然可能会将所有分支都提交!!!!!!!!!
git push <远程主机名> <本地分支名>:<远程分支名> 注意,分支推送顺序的写法是<来源地>:<目的地>, git pull <远程主机名> <远程分支名>:<本地分支名> 而git push是<本地分支>:<远程分支>。 如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。 git push origin master上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。

$ git push origin :master

等同于

$ git push origin --delete master

不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。

$ git config --global push.default matching

或者

$ git config --global push.default simple

9、分支操作:

1)合并分支

$ git merge branchname

这个命令把分支"branchname"合并到了当前分支里面。 当不需要合并分支提交记录时,使用--squash 选项。

git merge --squash branchname

2)删除远程devel分支:

 git push --delete origin devel

删除本地分支wyb_upgrade

git branch -d wyb_upgrade

删除远程devel分支:
git push --delete origin devel
删除本地分支wyb_upgrade
git branch -d wyb_upgrade

3)从已有的分支创建新的分支(如从远程dev分支),创建一个dev分支
git checkout -b dev origin/dev
4)创建完可以查看一下,分支已经切换到dev
wangyb@ubuntu1404test:~/ezH2C$ git branch -a -vv

  • dev 1e0e7bd [origin/dev] ver: update version number to 1.20.01.0000
    master c00a12f [origin/master] first commit
    remotes/origin/HEAD -> origin/master
    remotes/origin/beta c00a12f first commit
    remotes/origin/dev 1e0e7bd ver: update version number to 1.20.01.0000
    remotes/origin/master c00a12f first commit
    remotes/origin/release 3a6c0f2 ver: update version number to 1.20.01.0000
    remotes/origin/router 1401df1 switch: * 调整WAN口的位置到由外向内看的最左边
    remotes/origin/test 032e178 Merge branch 'dev' into test
    remotes/origin/wangyabo 4b151f8 * 修改原来与SO通信接口为SOCKET通信接口
    remotes/origin/zbg 315c619 format change from windos to linux
    remotes/origin/zgb 9550d77 all device,and main code change
    5)提交该分支到远程仓库dev分支
    git push origin dev (一定不要用git push, 因为有些git版本默认会push所有本地分支到对应的远端分支,可能误提交。)
    6)测试从远程获取dev
    git pull origin dev (可以用git pull,因为拉下来的代码不会影响到远端)
    7)更新远程分支及remote索引:
    git fetch
    8)将本地分支指向切换的远程dev分支:
    git branch --set-upstream dev origin/dev

git branch --set-upstream status origin/gw25

9)将本地test分支推送到远程origin/test:
git push origin test
10)将远程origin/test分支拉取到本地test,同时切换到本地test分支:
git checkout -b test origin/test
11)删除远程origin/test分支:
git branch -r -d origin/test
git push origin :test
git删除远程分支
git push origin --delete [branch_name]

创建一个本地功能分支feature-x,并且指向远端develop分支,并且切换到feature-x分支。
git checkout -b feature-x origin/develop

开发完成后,将功能分支合并到develop分支:
git checkout develop //切换到develop分支
git merge --no-ff feature-x //合并feature-x到develop分支

删除feature分支:
git branch -d feature-x

10、冲突处理:

当两条分支对同一个文件的同一个文本块进行了不同的修改,并试图合并时,Git不能自动合并的,称之为冲突(conflict)。解决冲突需要人工处理。比如当前在master分支,想把dev分支merge过来,结果产生了一个冲突,打开文件内容可以看到这么一个冲突:

<<<<<<< HEAD
test in master
=======
test in dev
>>>>>>> dev

<<<<<<<标记冲突开始,后面跟的是当前分支中的内容。HEAD指向当前分支末梢的提交。
  =======之后,>>>>>>>之前是要merge过来的另一条分支上的代码。>>>>>>> 之后的dev是该分支的名字。对于简单的合并,手工编辑,然后去掉这些标记,最后像往常的提交一样先add命令来表明冲突已经解决,再commit即可。

11、各种提交状态撤销:

** 撤销git add 添加到暂存区的文件:**

git reset platform/CentralWRT/src/ezDevAgent/src/ez_zgbdev.cpp.bak

** 撤销git commit操作:**

$ git reset --hard ORIG_HEAD 用来撤销已经commit 的merge.
$ git reset --hard HEAD 用来撤销还没commit 的merge,其实原理就是放弃index和工作区的改动。
git reset --merge ORIG_HEAD,注意其中的--hard 换成了 --merge,这样就可以避免在回滚时清除working tree。

** 撤销git commit提交,回退到指定commit版本:**
先用git log找到要回退版本,然后:
git reset --hard 2ea5705899dfc6bc24657ad70605dc00feca7437
1:git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
2:git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
3:git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

12、远程仓库回滚:

1、 删除最后一次提交,只需要以下两步就可以了

git revert HEAD
git push origin master

13、revert和reset的区别:

revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在,而reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。

如果删除远程仓库的最后一次提交的时候不需要保留历史记录的话,可以使用reset,命令如下:

git reset --hard HEAD^
git push origin master -f

-f 参数是强制提交,因为reset之后本地库落后于远程库一个版本,因此需要强制提交。

14、删除历史某次提交

这种情况需要先用git log命令在历史记录中查找到想要删除的某次提交的commit id,比如下图中圈出来的就是注释为"2"的提交的commit id(由此可见提交的注释很重要,一定要认真写)

然后执行以下命令("commit id"替换为想要删除的提交的"commit id",需要注意最后的^号,意思是commit id的前一次提交):

   git rebase -i "commit id"^

执行该条命令之后会打开一个编辑框,内容如下,列出了包含该次提交在内之后的所有提交。然后在编辑框中删除你想要删除的提交所在行,然后保存退出就好啦,如果有冲突的需要解决冲突。接下来,执行以下命令,将本地仓库提交到远程库就完成了:

   git push origin master -f

15、rebase 成功之后如何撤销回滚

git rebase 过程中可以使用git --abort/--continue来进行操作,成功之后如何撤销呢?

  1. 首先执行git reflog查看本地记录
    可知本次rebase之前的id 为:
    02a3260 HEAD@{9}: commit: adjust ds5 ir data save file formate
  2. 所以执行
    git reset --hard 02a3260
    即可
    git rebase 还是 merge的使用场景最通俗的解释
    merge 会把公共分支和你当前的commit 合并在一起,形成一个新的 commit 提交
    rebase会把你当前分支的 commit 放到公共分支的最后面,所以叫变基。把其它分支的提交插入合并到当前分支已经提交的commit前面。
    举例:如果你从 master 拉了个feature分支出来,然后你提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的时候多了几个 commit,如果这个时候你 rebase master 的话,就会把你当前的几个 commit,放到那个人 commit 的后面。

16、merge和rebase

实际上只是用的场景不一样 更通俗的解释一波. 比如rebase,你自己开发分支一直在做,然后某一天,你想把主线的修改合到你的分支上,做一次集成,这种情况就用rebase比较好.把你的提交都放在主线修改的头上 如果用merge,脑袋上顶着一笔merge的8,你如果想回退你分支上的某个提交就很麻烦,还有一个重要的问题,rebase的话,本来我的分支是从3拉出来的,rebase完了之后,就不知道我当时是从哪儿拉出来的我的开发分支 同样的,如果你在主分支上用rebase, rebase其他分支的修改,是不是要是别人想看主分支上有什么历史,他看到的就不是完整的历史课,这个历史已经被你篡改了
常用指令
git rebase -i dev 可以将dev分支合并到当前分支 这里的”-i“是指交互模式。就是说你可以干预rebase这个事务的过程,包括设置commit message,暂停commit等等。
git rebase –abort 放弃一次合并
合并多次commit操作: 1 git rebase -i dev 2 修改最后几次commit记录中的pick 为squash 3 保存退出,弹出修改文件,修改commit记录再次保存退出(删除多余的change-id 只保留一个) 4 git add . 5 git rebase --continue

常见问题:

git rebase 出现conflict怎么办
Rebase的执行顺序:
git rebase from_branch to_branch
从from_branch到目标分支to_branch进行rebase。结果是from_branch的代码更新到to_branch, 同时to_branch的commit log加到from_branch的最前方。如果出现conflict,如
Using index info to reconstruct a base tree...
M Keshin/keshin.xcodeproj/project.pbxproj
:121: trailing whitespace.
:173: trailing whitespace.
:277: trailing whitespace.
:329: trailing whitespace.
warning: 4 lines add whitespace errors. //空格告警不影响合并
Falling back to patching base and 3-way merge...
Auto-merging Keshin/keshin.xcodeproj/project.pbxproj
CONFLICT (content): Merge conflict in Keshin/keshin.xcodeproj/project.pbxproj
Failed to merge in the changes.
Patch failed at 0001 [KESHIN-381] Error Manager
The copy of the patch that failed is found in:
/Users/ou-h/Documents/Projects/src/git_src/fork_ou/katatema-ios-ou/.git/rebase-apply/patch
When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
可见,当前是文件Keshin/keshin.xcodeproj/project.pbxproj有conflict,

  1. 解决冲突:
    vim Keshin/keshin.xcodeproj/project.pbxproj
    打开文件,修改并解决冲突。
  2. git add Keshin/keshin.xcodeproj/project.pbxproj
  3. git rebase --continue
    git apply应用补丁时会检测空白错误,默认情况下,尾部空白,包含空白的空行,初始tab缩进之后紧跟的空白字符会被认为是错误。
    处理这个错误的行为由命令行参数--whitespace或者core.whitespace配置来控制,共有5种可能的动作:
    nowarn
    关闭错误提示
    warn
    输出部分错误提示,但完整的应用补丁,不会处理错误,这是默认动作。
    fix
    输出部分错误,修正错误后应用补丁
    error
    输出部分错误,拒绝应用补丁。
    error-all
    输出全部的错误,拒绝应用补丁。
    git更新远程分支名字

git checkout old_branch

git branch -m old_branch new_branch

git push --delete origin old_branch

git push origin new_branch

git branch --set-upstream-to origin/new_branch

代码提交原则:
在commit之后,push之前,如果有别人提交过代码,这时候做Push提交操作,就会存在合并的情况。所以在提交代码要先pull一把。

git pull origin dev

这里的origin为远端服务器,通过git remote -v可以查看到, dev为远程需要合入的分支。

你可能感兴趣的:(git操作备忘)