GIT撤销修改

作者:matrix 发布时间:2022年4月1日 分类:Linux

撤销本地修改

本地代码仅是修改,还未做任何提交(add/commit操作)

$ git checkout file_name_path_1  file_name_path_2 file_name_path_3...  #撤销指定文件的修改
$ git checkout .   #撤销所有文件的修改

git checkout会直接还原修改的文件到仓库版本

撤销add

$ git reset HEAD file_name_path1  #指定还原文件的add操作

$ git reset HEAD #还原所有文件

撤销commit

已经commit提交,没有push到远端

#修改(替换)掉上次的commit
$ git commit --amend -m "Fix bug #42" 

#撤销commit操作(保留修改)
$ git reset HEAD^  #回到上一提交版本

#撤销commit操作(放弃修改)
$ git reset --hard HEAD^

#手动reset 版本id
$ git reset [--soft|--mixed|--hard]   COMMIT_ID  #COMMIT_ID为需要还原到的正确版本(正确要保留的版本)

--mixed 会保留源码,只是将git commit和index 信息回退到了某个版本.

--soft 保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.

--hard 源码也会回退到某个版本,commit和index 都会回退到某个版本.(注意,这种方式是改变本地代码仓库源码)

撤销push

还原已提交push的修改,本质是新增commit提交

方法1 还原指定版本的修改:

$ git revert COMMIT_ID #COMMIT_ID为需要撤销的版本(丢弃不要的版本)
$ git push #再执行推送

方法2 硬删除之后的所有提交:

$ git reset --hard COMMID_ID #最近提交需要的版本(删除之后的所有提交)
$ git push -f

http://www.ruanyifeng.com/blog/2019/12/git-undo.html

http://blog.csdn.net/zhangkongzhongyun/article/details/8025288

https://www.cnblogs.com/wuyun-blog/p/10026363.html

https://www.jianshu.com/p/37f3a7e4a193

SVN或者GIT远程双向同步

作者:matrix 发布时间:2021年9月3日 分类:零零星星

现在我需要svn或者git的提交同步到其他远程仓库(svn或git),也就是同步操作。这里的同步最小单位为单次的提交commit。

配合之前的「使用git-svn管理svn仓库」可以完美解决这个问题,利用git来中转管理我们手上的仓库代码。

场景:

有多个相同代码的SVN仓库,我不想全部迁移到git。然而每次修改一个功能的代码就必须手动复制到其他的远程svn/git仓库上,代码相似但又不能直接替换。。。

之前使用git cherry-pick可以解决这个问题,但是要单独给svn用就会很麻烦。尝试用git svn中转试试!

1. 本地添加远程仓库

如果是svn仓库,先使用git svn clone svn://xxx.com/xxx克隆svn仓库到本地

2. 本地添加远程仓库

  • 添加远程SVN仓库:

没有找到命令行的方式添加远程仓库分支,但是可以修改 .git/config文件达到目的。

项目/.git/config文件中新增svn-remote配置:

[core]
    ...
[svn-remote "svn"]
    ...
[svn-remote "qingsui"]
     url = svn://xxxx/qingsui
     fetch = :refs/remotes/git-svn-qingsui

  • 添加远程git仓库:
    可以直接使用git命令添加:
 $ git remote add remote-repository-name https://git.weixin.qq.com/xxx.git

注意:remote-repository-name 为自定义的分支名

3. 拉取远程代码

  • 远程SVN仓库:
$ git svn fetch  qingsui

如果需要pull操作来自动更新合并执行命令git svn rebase

  • 远程git仓库:
$  git fetch remote-repository-name

4.新建对应的本地分支

  • 远程SVN仓库:
$ git checkout -b qingsui  remotes/git-svn-qingsui

$ git branch -a # 查看本地分支情况

  • 远程git仓库:
$  git checkout -b remote-repository-name remotes/remote-repository-name/master

5. 将commit提交合并到新分支

commit_id是需要同步到其他远程分支的commit id。

$ git cherry-pick  {commit_id}

6. 推送修改到远程仓库

  • SVN仓库:
$ git svn dcommit
  • git仓库:
$ git push

完美解决,实际上就是使用git来操作。

同步到远程svn仓库操作脚本

#!/bin/bash
#同步commit到其他远程仓库
#example:  shell.sh  dade,qingsui commitID1,commitID2
# dade,qingsui 为`git branch`本地分支名字
if [ ! $1 -o ! $2 ]; then
    echo -e "usage example:  \n $ shell.sh dade,qingsui commitID1,commitID2"
    exit
fi

repo_arr=(`echo $1 | tr ',' ' '`) 
commit_arr=(`echo $2 | tr ',' ' '`) 

for repo in ${repo_arr[@]};do
    for commit_id in ${commit_arr[@]};do
         git checkout $repo
         git svn rebase #git pull操作
         git cherry-pick $commit_id
         git svn dcommit
         git checkout master
        echo -e "\n"
    done
done


说明:
如果自动合并有冲突会操作会失败,需要手动修改再提交&推送。

如果需要git-svn自动输入密码>> https://www.hhtjim.com/git-svn-save-password-credentials-from-input.html

参考:

https://coderwall.com/p/vfop7g/add-an-svn-remote-to-your-git-repo

https://superuser.com/questions/354819/git-svn-pass-password-on-command-line

使用git-svn管理svn仓库

作者:matrix 发布时间:2021年8月24日 分类:兼容并蓄

git-svn工具是git对比较老的svn的兼容性支持,可以直接对svn仓库进行管理。git-svn内部其实是使用perl脚本处理svn命令,没有的话要重新安装git。之后就可以任意使用git的功能了,比如stash。

mac环境下直接输入命令git svn --version检查是否可用。

出现问题最好是重新安装svn和git:

$ brew reinstall subversion
$ brew reinstall git

clone项目

$ git svn clone svn://username@svn.hhtjim.com/repos

修改&提交

这里和git仓库操作一致

$ git add .
$ git commit -m "first commmit"

推送到远程仓库

使用git svn dcommit代替git push命令

$ git svn dcommit

查看本地仓库的svn地址信息

$ git svn info

参考:

https://www.jianshu.com/p/6a3afcb59fa9

Git-Svn保存密码凭证免输入

作者:matrix 发布时间:2021年8月12日 分类:兼容并蓄

使用git-svn管理svn项目每次操作都要输入密码 😳

之前尝试过 echo password | git svn rebase来自动输入,还有删除~/.subversion/auth目录的方法都还是失败,不能达到免输入密码的效果。

办法

以mac为例,打开应用钥匙串访问,删除掉对应svn项目地址的钥匙串<svn://svn.XXXX:3690>密码。
之后马上使用git svn命令操作,系统会自动保存新的密钥在钥匙串中。

图片5344-Git-Svn保存密码凭证

这样在任何程序操作之前去保存密码就可行。git-svn是读取系统保存的密钥,之所以有问题因为密钥是之前的程序授权的,现在使用git-svn也就无法读取。

这样操作之后我这里其他程序没有影响,如果有问题的话可以自行到svn项目目录执行缓存密码凭证操作。

$ svn update --username 'user' --password 'password'

参考:

https://newbedev.com/does-git-svn-store-svn-passwords

commit同步到其他仓库

作者:matrix 发布时间:2021年7月31日 分类:零零星星

不同的仓库可以互相同步其中任意提交的commit吗?可以的~

现有仓库enc,qsui,dada。三个的代码基本相同但是没有新建分支来区别。

本地会经常修改enc代码来提交到其远程仓库,但是其他仓库咋办?我不想每个再修改提交。

办法

大致思路就是本地仓库添加其他remote远程分支,本地抓取之后新建本地分支进行关联,再git cherry-pick合并提交到本地新的分支,之后push即可。

步骤

  • 1.enc本地添加远程
$ git remote add dada  https://git.weixin.qq.com/wx_wx8fffaa009d109aa1/dada.git

$ git remote  -v # 查看远程仓库分支

  • 2.抓取到本地
$ git fetch dada
  • 3.新建本地分支
$ git checkout -b dada dada/master #远程dada/master分支新建为本地分支「dada」,且当前分支切换到dada

$ git branch -a # 查看本地分支情况
    * dada
      master
      remotes/dada/master
      remotes/origin/master

  • 4.将commit提交合并到新分支
$ git cherry-pick d4df33b962910XXXX
  • 5.push推送
$ git push dada dada:master

一句话同步操作

$ git checkout qsui  &&  git cherry-pick dad6432037fcadcd35405aaa331dd367e58b1e2e   &&  git push qsui qsui:master 

多分支多commit操作脚本


#!/bin/bash #example: shell.sh dada,qsui commitID1,commitID2 # 同步commit到其他远程仓库 if [ ! $1 -o ! $2 ]; then echo -e "usage example: \n $ shell.sh dada,qsui commitID1,commitID2" exit fi repo_arr=(`echo $1 | tr ',' ' '`) commit_arr=(`echo $2 | tr ',' ' '`) for repo in ${repo_arr[@]};do for commit_id in ${commit_arr[@]};do git checkout $repo git pull git cherry-pick $commit_id git push $repo $repo:master echo -e "\n" done done git checkout master

参考:

https://www.bestyii.com/topic/40

https://blog.zengrong.net/post/bash_array/

https://blog.csdn.net/Jerry_1126/article/details/83930956

ssh config多账户/多域名配置

作者:matrix 发布时间:2019年6月18日 分类:Linux

测试环境:ubuntu

客户端连接远程ssh/git服务的时候可以在本地配置SSH config,用于简化多参数使用操作或者修改默认的ssh命令使用的配置。

我这里需要使用gitee的ssh密钥来管理远程仓库代码,方便以后可以免密码提交/更新代码。然而本地已经存在一个~/.ssh/id_rsa私钥,且还设置了用来保护私钥的passphrase密码。如果用之前的私钥连接gitee会造成每次都要求输入passphrase密码,亦或不能单独区分使用。
这个问题可以使用配置文件~/.ssh/config来解决

新建新的密钥对

$ ssh-keygen -t rsa -C "user"

新建的时候设置新密钥的保存路径,避免把之前的覆盖掉

配置

config文件默认是不存在的,直接新建即可

$ vi ~/.ssh/config

使用下面配置:

# gitee账户
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rrsa_gitee

说明:
Host类型昵称,可以简化登录的输入地址,比如Host ccl,则可以用ssh ccl直接连接
HostName表示连接的远程主机地址
IdentityFile表示指定私钥文件路径
还有其他参数
Port指定端口
User指定用户名

这种配置可以让ssh来根据远程host地址来使用不同的私钥,设置了User还可以让ssh工具不同用户名来读取配置,也可以使用相同host地址哟~

比如都是github的不同账户,类似配置:

Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user1_rsa
User user1


Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user2_rsa
User user2

参考:
https://gitee.com/help/articles/4229
http://vra.github.io/2017/07/09/ssh-config/
https://gitee.com/help/articles/4181
https://daemon369.github.io/ssh/2015/03/21/using-ssh-config-file

PEACE~

GIT仓库迁移

作者:matrix 发布时间:2018年12月1日 分类:零零星星

git仓库之前可以简单的实现包含所有提交信息数据完全搬迁操作。在之前link站的git仓库使用的csdn,后来没有维护就转移到了gitee。最近发现墙外的环境无法正常连接到gitee,也就想试试git仓库的迁移。

新建空白仓库

在新仓库建立git项目,我这里用的腾讯开发者云 https://dev.tencent.com/
获取git地址 如:https://git.dev.tencent.com/plola/link.git

克隆旧库到本地

git clone https://gitee.com/rollio/link.git --bare

说明:
--bare 参数用于复制裸仓库也就是只是复制一个类似软连接的东西.git信息 不会把仓库中的代码文件copy下来
这个裸仓库只会保存git提交的历史版本信息,上面不能进行各种git操作

推送到新库

cd link.git/ #进入刚刚克隆时生成的git目录

git push https://git.dev.tencent.com/plola/link.git --all  #推送数据

git push https://git.dev.tencent.com/plola/link.git --tags #推送标签

最终完成。 操作就几步,真的很简单方便。以后再也不用担心git数据搬家问题了,以后我的所有commit都在 哈哈。

参考:
https://coding.net/help/doc/git/import.html
https://blog.csdn.net/feizxiang3/article/details/8065506

PEACH~

管理JAE代码的Git工具安装汉化

作者:matrix 发布时间:2014年8月31日 分类:零零星星

放在jae的代码修改的时候使用git方便很多,由于没有接触过git,这里记录一些。

以win8-64bit为例:

安装工具

msysGit[Git-1.9.4-preview20140611]

TortoiseGit-64bit

TortoiseGit-64bit中文语言包

汉化步骤

安装完这仨文件后重启。

右击资源管理器任意空白位置,选择 TortoiseGit -> Settings

选择 TortoiseGit -> Settings

 

从右侧语言设置中,选择简体中文。

选择简体中文

参考:http://www.freehao123.com/jae-git/