GIT工作中遇到的问题记录

一、基本的一些操作

1、每次合入代码提单到phabricator时,需要使用arc小助手新建一个分支,

arc branch GerritWarning

如果先前自己用git branch pha创建的分支pha,在GerritWarning分支上将pha分支的改动合并到要提交的分支上来:

git merge pha

如果在创建pha分支之后,dev分支有过pull操作。由于git 的 commit是按照时间先后顺序来排,此时可以将pha分支自己的提交回退,

git reset HEAD~1

然后重行提交

git commt -am “    message    ”

使得自己的commit是最近的,然后切换到GerritWarning分支,将pha分支的内容合并进来,此时自己的提交在GerritWarning分支是是最近的。


2、git 和 gerrit 搭配使用时,push代码时提示:

Gerrit: remote rejected (you are not allowed to upload merges) even though I allowed “Push merge commit”  推送代码失败。此时

出现此问题,是 gerrit 服务器不允许开发线有分叉,只能保持一条主线。reset 到自己提交的节点,执行

git rebase

再手动解决冲突,然后

git add + 解决了冲突的文件

接着

git rebase --continue

最后重新push即可,注意,git rebase出现的冲突解决之后不能执行git commit,而是用git rebase --continue

总之,使用rebase 保持一条线,在知道gerrit的该问题时,在pull的过程中,可以指定合并策略:

git pull --rebase


3、回退指定文件到某一版本

git log hello.py

查看文件的更改commit,找到需要回退的版本的SHA(可使用git log 加上筛选条件来查找).

git reset SHA hello.py

此时工作区的代码文件并没有回退,回退的是暂存区的,checkout出来即可。

git checkout hello.py

此时hello.py即就是回退到SHA的版本中。

    方法二:查看到ID之后,直接git checkout SHA hello.py即可,如果是某次更改之前,可以git checkout SHA~1 hello.py

对于路径或者单文件来说,checkout == reset --hard (如果此时reset --hard能使用,只是这么个意思)


二、在Linux共享给windows的服务器上创建git仓库,从而将windows的代码push 到Linux服务器上进行编译。

将linux 路径共享给windows 的方法:

1. 目录共享(可直接在window下访问)
1) 修改 /etc/samba/ smb.conf 文件 配置,增加需要共享的目录配置
[zhanghang]
comment = zhanghang
path = /home/zhanghang
writable = yes
2)重启samba 服务器
sudo /etc/init.d/smbd restart

2、添加 git 仓库

在linux自己用户目录下创建目录UTCA
mkdir UTCA
cd UTCA
git init    //初始化仓库
修改配置文件,将.git/config文件的最后添加
[receive]
    denyCurrentBranch = ignore
    

在本机git bash中添加远端仓库:
git remote add UTCA //10.11.157.147/zhanghang/code/SDR_CODE/UTCA
    //add后的UTCA表示仓库名,可以任意取
    
将本机的代码同步到远端仓库:
git push UTCA localBranch:remoteBranch
    //将本地分支代码同步到远端分支remoteBranch(名称任意取,建议与本地保持一致)
    
git remote -vv  //查看远端仓库的信息,直接clone下来的代码,默认的远端仓库名origin
应该可以看到两个远端仓库
UTCA    //10.11.157.147/zhanghang/code/SDR_CODE/UTCA (fetch)
UTCA    //10.11.157.147/zhanghang/code/SDR_CODE/UTCA (push)
origin    ssh://[email protected]:29418/sdr/UTCA (fetch)
origin    ssh://[email protected]:29418/sdr/UTCA (push)

远端仓库此时有remoteBranch和master分支(git branch此时看不到master分支,maseter分支下没有任何东西)
git status可以看到remoteBranch分支
git checkout remoteBranch   //从仓库里检出所有代码到当前工作区

之后改动只需在本地commit之后,执行
git push UTCA localBranch:remoteBranch  //然后在linux上编译

注意:如果远端仓库正好在要push的分支,在本地执行push操作之后,远端的工作区不会显示推送的内容,
而是保存原来的内容,所以此时在远端上使用git status查看push中的修改文件会是暂存区中修改状态。
执行 git reset --hard HEAD 即可将推送的内容同步到工作区。

三、配置GUI的difftool

[diff]
    tool = araxis
[difftool "araxis"]
    path = D:\\Program Files\\Araxis\\Araxis Merge\\Compare.exe

[merge]
    tool = araxis
[mergetool "araxis"]
    path = D:\\Program Files\\Araxis\\Araxis Merge\\Compare.exe
[mergetool]
    keepBackup = false

之后只用执行 git  difftool 和 git mergetool

注意remote local的排列顺序,remote表示要merge进来的,local表示当前的工作目录

然后就可以用git difftool比较两个节点之间的差异了:

git difftool sha1 sha2

或者连个节点中某个文件的差异:git difftool sha1 sha2 filename  

filename 支持将文件拖入到git bash里边,能够自动转换为相应的绝对路径。

当merge有冲突时,使用git mergetool自动打开冲突的文件,进行手动的合并操作。


有时候需要通过连接终端来连接服务器上来看代码,这时候就只能全文本操作了。

在windows上,git的默认编辑工具也是vim,配置文件为:D:\Program Files\Git\etc\vimrc

默认的不显示行号,需要添加行号:

set nu   

默认的行号的显示颜色为黄色,比较模糊难看,重新配置:

highlight LineNr ctermfg=darkblue    #将前景色配置为深蓝色

将当前行设置为绿色:

set cursorline
highlight CursorLine  ctermbg=green

将当前光标所在的列也设置为绿色,这样光标就在十字的交汇处:

set cursorcolumn
highlight CursorColumn ctermbg=green

使用vimdiff  选择窗口作为当前的窗口:ctrl + w + w.

]c   跳到下一个不同处,[c 跳到上一个不同处。

qa  关闭所有的窗口退出。


四、gerrit服务器与git

git服务器上下载代码,最好用git协议,而且在使用

ssh-keygen -t rsa -C "[email protected]" 生成密钥时,最好把密码留为空,这样每次合入代码不需要输入密码,比较方便。

如果使用htttp协议,需要每次都输入密码,比较麻烦。这个密码在gerrit 的 Http PassWord 项的 PassWord里边,是个可以随时更改的密码,支持复制。





你可能感兴趣的:(git)