目录

0. 前言

1. git stash: 暂时保存本地修改

2. git push时发生冲突怎么办?

2.1 平凡的merge

2.2 有冲突的merge

3. 访问过去的提交版本:git checkout

3.1 detached HEAD

3.2 “detached HEAD”状态下所作的修改会怎样呢?

3.3 “detached HEAD”状态下所作的修改如何汇入开发branch? 

4. 取消或恢复

4.1 git reset

4.2 git revert

4.3 git checkout

4.4 恢复某个文件到特定版本

5. 创建bare repository

6. git tag: 标签操作

6.1 何谓标签?

6.2 基本命令

列出所有标签信息 

在提交历史中查看标签

 显示指定标签信息 

推送标签

删除标签

 创建轻量标签

 创建附注标签

检出标签

6.3 打tag操作步骤例

7. git igonore list

7.1 Define git ignore pattern 

7.2 为什么.gitignore不生效?


0. 前言

        记录日常git使用过程中碰到的一些常见问题的解决,以及一些常用技巧。作为自己作为git使用者的从入门到进阶的成长过程。不求完备但求简洁实用。动态更新。。。

1. git stash: 暂时保存本地修改

        多人工作的项目中,经常会碰到自己在本地做了一些修改(但是还没有经过验证,没有做好要提交的准备),这个远程库已经有更新,需要pull下来在这个最新版本基础上进行自己的修改的验证。这时,pull一下的话会碰到以下这种错误:

        简而言之,就是因为本地有修改而且还没有commit(not yet being staged),所以git不允许你pull远程最新版本,因为它不知道该拿你本地修改的东西与远程版本中的更新怎么办。如果你本地commit了话,那么git会在pull时自动进行merge,如果merge时发生冲突,会在merge版本中留下标志。但是你本地修改没有commit,git就不知道该咋办了,干脆报警撂挑子不干了。

        简单的对策(三板斧):

git stash

git pull 

git stash pop

        第一条命令是将本地修改暂时保存起来,这样本地版本就回到上一次pull下来的状态。这样的话,再执行第1条git pull命令就不存在冲突了。然后,第3条指令的意思是重新把刚才暂存起来的本地修改弹(pop)出来,再次patch到最新pull下来的最新版本上去。

        那怎么确保在以上操作过程中自己原本所做的修改没有丢失呢?

        在以上操作过程之前执行一下“git status”,然后在以上操作过程后再执行一次git status,两次git status所得到的结果应该一致,即应该都列举了本地修改过的文件有哪些。当然,更保险的做法是手动备份自己所作的本地修改,然后在执行以上操作之后,用diff进行手动备份文件与本地库中的文件确认自己所作的修改是否还在。

        关于git stash的更全面的解说参见:git stash - Saving Changes | Atlassian Git Tutorial

2. git push时发生冲突怎么办?

2.1 平凡的merge

        执行git push时常常会碰到以下错误:

         这是因为在你git pull之后在本地做了修改到现在要push上去的期间内,有其他人对远程git库做了修改。

        最简单的解决方案就是,先执行“git pull”,将远程库的更新拉下来。这时由于本地的更新已经commit了,git在pull时会自动执行远程更新与本地更新的merge。

        如果本地更新与远程更新没有冲突,比如说,没有针对相同的文件进行更新,那就只是平凡的merge,大家相安无事,执行完git pull后再次执行git push即可。

        如果本地更新与远程更新存在冲突呢?。。。且听下回分解。

2.2 有冲突的merge

        如上一节所述,如果远程版本库中的更新和本地的更新不是针对相同文件的话,那么git自动做版本库的merge是毫无障碍的。甚至在远程更新与本地更新是针对相同文件,但是是针对不同部分的更新,git也能够给出没有歧义的更新。但是,当远程更新和本地更新是针对同一文件的的相同部分进行不相同的更新的话,这时候git就无法进行清楚明白的merge。但是git会给出如下图所示的merge版本,保留两方面的更新,并提示用户自己手动尽心merge修改:

上半部分是显示merge后的版本。其中“<<<< HEAD”所表示的部分为从远程版本库拉下来的更新版本,而“>>>>>>>”标示的则是本地所作的修改,git无法进行合理的取舍,因此将两者都保留下来,留给开发者去自主决定取舍并给出最终的merge(就是进行普通的编辑即可。)

3. 访问过去的提交版本:git checkout

        当想要访问既往历史版本时,可以使用git checkout命令。开发过程中经常会需要追溯历史版本去查找某个功能问题是从哪个历史版本开始导入的。

git checkout commit-id

        这条命令会切换指定的commit-id。而commit-id可以用用git log命令进行查询,比如说:

git log

git log --oneline

        --oneline选项是给出简洁的输出,将信息压缩到一行中输出。 

        执行以上命令后,就可以在恢复的该commit版本上做验证、修改等操作,这些操作仅对该commit有效,不会影响其它branch,比如说开发工作所在的主branch(main or master等)。

3.1 detached HEAD

        通常来说,HEAD会指向某个branch。但是,当执行git checkout后,HEAD就不再指向任何branch,而是仅指向该commit。这就是所谓的“detached HEAD”状态,或者说游离状态。

        在这个状态下,所作的修改无法提交到各开发branch中去。

        要想从这个游离状态返回到开发状态(比如说进入该游离状态之前的branch)去,直接执行以下命令即可:

git checkout <branch-name>       # 切换到某指定branch

        比如说,如果是从main or master branch进入该游离状态的话,则可以执行以下命令回去:

git checkout master [or main]

        * git缺省创建的应该是master branch。用户可以自己指定为main branch(尤其在西方讲究政治正确的背景下,master与slave相对应有被误解攻击之嫌)

3.2 “detached HEAD”状态下所作的修改会怎样呢?

        coming soon...

3.3 “detached HEAD”状态下所作的修改如何汇入开发branch? 

        coming soon...

        git checkout命令还有以下一些使用方式:

git checkout -b <branch-name>  # 创建新的branch并切换到该branch

git checkout -- <file>                    # 放弃对指定文件的本地修改,恢复到本地版本库中的状态

4. 取消或恢复

4.1 git reset

        git reset command will reset the index and the working directory to the last git commit’s state.

git reset --hard HEAD

4.2 git revert

4.3 git checkout

        如果本地针对某个文件做了修改,但是不想保留这个修改,换句话说要恢复到HEAD所指向的版本状态,可以用git checkout命令:

Git checkout -- file-to-be-recovered-to-origin-state

4.4 恢复某个文件到特定版本

        问题:对于某个Git控制下的文件进行了修改,但是发现问题,需要退回到改之前的版本。假定该文件为 /pathto/somefile.txt

        解决方法:

        第一步: 在命令行中输入 git log /pathto/somefile.txt 得到该文件的commit 历史。 

        第二步: 复制需要回退版本的hash(commit ID),在此假设我们回退到 4297ff2945d4f78d9804ba0f5658a66d39ba46e9 ,则复制该序列即可

        第三步:对该文件checkout 对应版本。命令为 git checkout <hash> <filename(including path)>, 在此即为命令行中输入 :

git checkout 4297ff2945d4f78d9804ba0f5658a66d39ba46e9  /pathto/somefile.txt        

        第四步: 如果需要将该版本重新commit的话,则执行commit命令即可:

git add /pathto/somefile.txt

git commit -m "revert to previous version"        

5. 创建bare repository

        --> git: Linux中创建中心仓库(or 裸仓库:bare repository)

6. git tag: 标签操作

6.1 何谓标签?

        简单的理解,tag 就是对某次commit 的一个标识,相当于起了一个别名。例如,在项目发布某个版本的时候,针对最后一次commit 起一个 v1.0这样的标签来标识里程碑的意义。有两种类型的标签:轻量标签(lightweight tag)、附注标签(annotated tag):

        【轻量标签】:只是某个commit 的引用,可以理解为是一个commit的别名;

        【附注标签】:是存储在git仓库中的一个完整对象,包含打标签者的名字、电子邮件地址、日期时间 以及其他的标签信息。它是可以被校验的,可以使用 GNU Privacy Guard (GPG) 签名并验证。

6.2 基本命令

列出所有标签信息 

git tag : 直接列出所有的标签

在提交历史中查看标签

git log –oneline –graph

 显示指定标签信息 

git show {标签名}   # (轻量标签 和 附注标签 的信息是不一样的)

推送标签

        默认情况下,git push命令不会将标签推送到远程服务器,需要使用以下命令将标签推送到远程服务器:

git push origin {标签名}

        如果要一次性推送所有本地标签,可以使用以下命令:

git push origin --tags

删除标签

        删除本地标签的命令如下:

git tag -d {标签名}

        删除远程标签的命令如下:

git push origin :refs/tags/{标签名}

 创建轻量标签

git tag 标签名           # 直接给当前的提交版本创建一个【轻量标签】
git tag 标签名 提交ID    # 给指定的提交版本创建一个 【轻量标签】

        如果没有指定“提交ID” 的话,自然就是针对当前分支的最新提交打标签。

 创建附注标签

git tag -a {标签名} -m "{标签信息}" {提交ID}

        例如,创建一个指向最新提交的附注标签:

git tag -a rev1.0 -m "Release version 1.0" HEAD

检出标签

        检出标签的操作实质是以标签指定的版本为基础版本,新建一个分支,继续其他的操作。因此,就相当于是新建分支的操作了。        

6.3 打tag操作步骤例

在Git中可以遵照以下步骤进行打tag操作:

  1. 查看最新的提交ID,可以使用以下命令:
    git log -1 --pretty=format:"%H"
  2. 执行以下命令,创建一个轻量标签:
    git tag {标签名} {指定提交ID}
    或者执行以下命令,创建一个附注标签:
    git tag -a {标签名} -m "{标签信息}" {指定提交ID}
    如果不指定提交ID的话,则默认会使用当前所在分支的最新提交作为标签指向的提交
  3. 将标签推送到远程服务器,可以使用以下命令:
    git push origin {标签名}
    如果要一次性推送所有本地标签,可以使用以下命令:
    git push origin --tags
    其中,{标签名}是标签的名称。

7. git igonore list

7.1 Define git ignore pattern 

        Ref: .gitignore file - ignoring files in Git | Atlassian Git Tutorial

7.2 为什么.gitignore不生效?

        Ref: .gitignore不生效问题解决方法_gitignore文件不生效-CSDN博客


 

ref: Git Tutorials and Training | Atlassian Git Tutorial

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐