娜尼的妮妮

导航

git 常用操作总结-实战宝典

有时候我们需要把一个仓库从一个服务器copy到另一个服务器上去,保留全部的tag,分支,历史记录。
git clone --bare 可以实现所有的tag和分支全部保留
git clone --bare git://git.yoctoproject.org/meta-ti

会有一个meta-ti.git 的文件夹存在

  

git 常用的操作命令

 1.git 提交代码的一般命令

git checkout branch
git fetch origin 

git rebase origin/branch
modify your work
git add your work
git status git rebase --continue
git status git push origin HEAD:refs/for/branch

2. git log 

git log查看log特定信息的参数:
git log --pretty=format:"%H %cd %ce %s"
H        harsh值,commitID
cd        commit date
ce        commit email
s          summary

git log commitID1 commitID2 --pretty=format="XXXXXXXX"用这个命令列出两个提交之间的change list, 一般的changelist 生成的核心命令用的是这个。format可以根据自己的需要使用对应的参数

 

3.git reset 

有时候 git push 提交代码到一半的时候,不小心中止了,再次提交会报错
[remote rejected] HEAD -> refs/for/XXXX (Unable to create changes: LOCK_FAILURE)  LOCK_FAILURE
出现这种问题的时候,git reset --soft HEAD~ 回退到commit 之前的状态,重新提交,生成新的changeid就可以解决
git reset --soft HEAD~ 回退本地仓库,保留index 区和本地workspace的修改
git reset --hard HEAD~ 回退本地仓库,连同index区和本地workspace的修改也全部回退

  

4. git push 

git push --set-upstream origin developing 
如果分支在创建的时候是基于远程分支创建的,会自动创建好push 和pull的关联分支。如果不是基于远程分支创建的,则会有提示信息要求创建远程push的关联分支

 

之前在git push 的时候遇到过报错unpack error
解决办法:git push 加上参数--no-thin
These options are passed to git-send-pack(1). A thin

transfer significantly reduces the amount of sent data when
the sender and receiver share many of the same objects in
common. The default is --thin.
错误提示是unpack error 打包时出现的错误,--no-thin 表示在提交代码的时候对代码不进行打包。

 

在往gerrit上提交代码的时候有遇到报错 no new changes, 可能事新生成的changeID 和之前的有重复,重新git commit --amend 生成新的提交就可以。
这个是概率极小的,且仅限于gerrit, 因为gerrit 有changeID 这个机制

  

  

 

5. git tag 

git tag -a tagname -m "comment"   // -a 表示annotated 带注释
git push --tags  //推送到远程仓库
git tag -d tagname //删除本地tagname
git push origin :resf/tags/tagname //推送一个空的tag到远程服务器,就表示在远程删除这个tag
git push origin tagname //推送tagname 到远程服务器
git push --tags // 推送本地所有tag 到远程服务器,慎用

 

6. git origin

git remote add originname <remote_address> //在本地添加对应的远程仓库的地址,名字,用作git 操作时远程地址的代名词
git remote rm oringiname //删除本地关联的远程仓库的链接
有时候origin 配置在本地的配置文件中,比如.gitconfig ,需要去check下信息是否正确
 

  

7. git stash

 有时候本地修改了一个文件,没有完成, 还不想commit,但是突然需要切换到别的分支,这时候可以先把修改一半的文件git add ,
git status 可以看到有文件待add 

git stash save //保存文件到本地暂存区
git status // 可以看到工作区现在是干净的,没有需要add的文件
git stash list  //查看暂存区的历史
git stash pop //弹出某个暂存 到工作区继续开发

 

8. git 删除远程分支

  

git push origin --delete <remote-branchname>
有时候由于误操作创建了错误的远程分支,需要删除,可以用这个命令。但是在删除之前,一定要谨慎,确认是否能删除。
还有一种方法,同tag 的删除方法,push 一个空分支到远程覆盖,就相当于删除了
git push origin :<remote-branchname>

9 git debug 命令

有时候在repo sync的时候遇到错误
error.GitError: manifests rev-list ('^HEAD', u'65bd17740482f34c72b44e8f841ba532ee729612', '--'): error: Could not read 26f2f5785b3ff83b827981f3c5b966164ad47a44

像这种error.GitError,log中没有显示具体哪个repo出了问题,需要先定位到有问题的repo。命令为:
repo --trace sync -cdf
--trace 可以看到过程中具体发生了什么,到最后会显示有问题的仓库,然后在.repo/projects 和.repo/project-objects 中删掉有问题的仓库,重新repo sync可以成功。
这样就可以避免删掉整套代码,重新拉代码,节省时间。

 

10 git 创建空分支

  

有时候会用git 存储一些二进制文件,在这个仓库里需要创建新分支,如果基于某个已经存在的分支创建,会导致仓库体积增大,且之前的二进制文件对于新分支并没有任何意义,这时候就需要创建一个新的空分支,不需要任何历史记录。命令如下:
git checkout --orphan <branchname>
git status
按照提示删除对应的文件
git rm -rf .

touch readme // 创建一个空文件,以便创建第一个初始提交
git add .
git commit -m "initial blank branch"
git push

 

11 windows 文件名过长git 报错

error: unable to create file XXXXX  Filename too long

解决办法参考:https://stackoverflow.com/questions/22575662/filename-too-long-in-git-for-windows

git config --system core.longpaths true

  

12 git fetch -p

     git fetch --prune 如果远程分支被删除了,删掉本地对应的分支

 

13 git checkout -B localbranch origin/branchname

    create/Reset 创建或者reset本地分支。在本地有cherry-pick 或者fetch Pullrequest之后 清理环境可以用这个命令

 

14 git 在windows/linux 平台下 空格符的处理

git config --global core.autocrlf false

  对于windows linux跨平台操作的时候,windows下git会自动在文件结尾加上换行符,导致文件md5值校验不一致,有时候会导致编译失败。需要关掉windows自动添加换行符这个配置

 

15 git在git 目录树以外进行操作

      有时候需要对多个git 仓库进行操作,但是这些仓库又不是repo 管理的,不能用repo forall 进行批处理,又不想进到每个仓库下进行git 操作。这时候可以在外层使用git -C 这个命令

git -C <other git repo path> [git command] 在git1.85之后,git支持在其他指定仓库下执行git命令
git -C B log //在B仓库中执行git log命令
git -C .repo/manifests fetch --tags -f //在.repo/manifests 仓库中强制fetch tag
 

  

16 git cherry-pick

git cherry-pick --strategy=recursive -X theirs  FETCH HEAD
在cherry-pick 二进制文件的时候,会遇到冲突,保留被cherry-pick的文件使用参数theirs, 保留自己的用ours

  

17 git clone --bare

 

有时会遇到需要把仓库从一个服务器复制到另一台服务器的需求,这时候需要用到git clone --bare 命令

pre-condition:
目标服务器已经创建好target仓库
账户有目标服务器的强制push权限

步骤:
1  git clone --bare git://git.yoctoproject.org/meta-ti
2 cd meta-ti.git
    git remote add gerrit1 ssh://pwen@gerrit.com:29418/target_meta-ti
    
3 git remote -v
   可以查看gerrit1 仓库信息在列表中

4 git push -o skip-validation gerrit1 --all
   git push gerrit1 --tags

git clone --bare 会保留源仓库里面的tag 和branch信息。在push到目标仓库的时候记得要把 --tags 都push上去

  

posted on 2021-06-28 15:35  娜尼的妮妮  阅读(475)  评论(0编辑  收藏  举报