git小技巧

一、git commit提交之后,发现有错误怎么办?

当commit之后发现代码有错,简单直接的方法就是进行修改代码,然后第二次commit。

这样git log可以看到两次commit的信息

其他思路

如果你commit了之后还没有推到远程仓库,commit信息还在本地,此时可以根据git log的hashid来重置commit版本信息。

git reset

git reset –mixed
复制代码

此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

git reset –soft
复制代码

回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

git reset –hard
复制代码

彻底回退到某个版本,本地的源码也会变为上一个版本的内容

修改备注信息

git commit -amend
复制代码

二、怎么在项目开始/项目中正确的添加忽略文件或目录?

忽略文件

git rm与git rm --cache的区别

当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用

git rm file_path
git commit -m 'delete somefile'
git push
复制代码

当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用

git rm --cached file_path
git commit -m 'delete remote somefile'
git push
复制代码

忽略一个已经被跟踪的目录(再也不管它了):

git rm -r --cached dir
echo dir/ >> .gitignore
git add .gitignore
git commit -am 'ignore dir forever'
复制代码

三、怎么给git命令创建快捷方式?

git alias
复制代码

第一种方法

通过配置git本身:

git config --global alias.s status
复制代码

从此,git s就是git status

第二种方法

vim ~/.gitconfig
复制代码

第三种方法: 配置系统的别名

vi ~/zssrc
复制代码

四、git stach是什么?

git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug, 先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。

基础命令

$git stash
$do some work
$git stash pop
复制代码

进阶

   git stash save "work in progress for foo feature"
复制代码

当你多次使用’git stash’命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,

’git stash list’ 命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用’git stash apply stash@{1}’就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用’git stash clear’来将栈清空。

git stash          # save uncommitted changes
# pull, edit, etc.
git stash list     # list stashed changes in this git
git show stash@{0} # see the last stash 
git stash pop      # apply last stash and remove it from the list

git stash --help   # for more info
复制代码

五、git rebase是什么?

rebase 的概念/作用其实很简单——就是「变基」。具体来说,就是改变一条分支的「基点」,使原分支从指定的地方(commit)重新长出来。并且,由于是一条新分支,你可以随意修改其中的 commits,也就是——重写分支历史。

而 rebase 的主要目的即删繁就简。

下面讲下关键步骤:

git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]    [<upstream> [<branch>]]
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]    --root [<branch>]
git rebase --continue | --skip | --abort | --edit-todo
复制代码

所有 rebase 的操作对象都是 commit。(你可以 rebase 一个分支 git rebase -i branchX,但实际上还是作用于该分支最新的 commit。)

以这个 commit 为「新基点」发起 rebase 后,会打印出一篇 commit 历史让你修改。

其中最常用的修改就是把 commit 前的 pick 改为 s (squash, /skwɔʃ/, 意为挤压),作用为保留该 commit 作出的修改,但删去该节点,只给它一个留名的机会。(用专业的话讲就是——不保留待合并分支上的历史信息,也不提交、不移动HEAD。)多个以 s 为前缀的 commit 最终会整合成一个 commit,各个 commit 的描述部分也被整合到一起。

而最终极的修改就是直接删去 commit(s) ——篡改历史。这也就意味着,对应的改动也一并灰飞烟灭。(所以为什么说 rebase 是个危险的操作,就是因为篡改了历史!想想如果别人基于你国正史 fork 了一条分支,而你日后竟变基了会发生什么吧!)

改完之后 :x(Vim下的保存退出命令),Git 就去检测冲突了,此时类似于合并。 合并将按你留下的 commit(s) 重演历史,你可以修改每一次 commit 的具体代码。而如果你不是为了修改,只是为了简化树……我的办法是只留下一条 commit,用最新工程完全覆盖来解决冲突。(不知有没有更好的方法)

冲突解决完后 git rebase --continue,你就可以正式「书写」历史啦——撰写新的 commit 描述。这时那真是,想怎么写就怎么写~

这般本地 rebase 完成后,记得 git push -f,-f 用于强制将新历史推送至远程仓库。 至此,rebase 就彻底结束了。

看看你新造的树吧,是不是特简洁,特优美?(如果不是……你 rebase 干嘛……)

当一个系统的专有名词(黑话)足够多,就创造了文化。

在贡献开源代码时,git rebase可以直接把log同步过来,而不会有 git merge 的log。

怎么打标签,打标签有啥用?

打标签

同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签。人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做。本节我们一起来学习如何列出所有可用的标签,如何新建标签,以及各种不同类型标签之间的差别。 列出已有的标签

列出现有标签的命令非常简单,直接运行 git tag 即可:

git tag
v0.1
v1.3
复制代码

显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。

我们可以用特定的搜索模式列出符合条件的标签。在 Git 自身项目仓库中,有着超过 240 个标签,如果你只对 1.4.2 系列的版本感兴趣,可以运行下面的命令:

git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4
复制代码

新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。 含附注的标签

创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

git tag -a v1.4 -m 'my version 1.4'
git tag
v0.1
v1.3
v1.4
复制代码

而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。

可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

git show push_v1.2
tag push_v1.2
Tagger: machuang <780@qq.com>
Date:   Sun Sep 10 12:06:50 2017 +0800

version 1.2 project coding end at 2017-8-23.
This tag create at 2017-9-10
s

commit f1759f45b598611231d9e768
Merge: f8f4 saf9
Author: XScarletAngel <7369@qq.com>
Date:   Wed Aug 23 18:30:27 2017 +0800

    Merge branch 'branch1.2' of git.du.com:admin/admin into branch1.2

    * 'branch1.2' of git.du.com:admin/admin:
      Test
复制代码

我们可以看到在提交对象信息上面,列出了此标签的提交者和提交时间,以及相应的标签说明。

根据commitid打标签

git tag -a <tag名> <commit对应的hash码>
复制代码

tag推送到远程仓库

默认情况下,git push并不会把tag标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。 1.push单个tag,命令格式为:

git push origin [tagname]
复制代码

例如:

git push origin v1.0 #将本地v1.0的tag推送到远端服务器
复制代码

2.push所有tag,命令格式为:

git push [origin] --tags
复制代码

例如:

git push --tags
复制代码

git push origin --tags
复制代码

以上命令经检验通过,如果不起作用,请在Git控制台上确认你的账号是否有权限推送Tag。

<think>嗯,用户现在想获取关于Git使用的技巧和小窍门。我需要结合之前提供的引用内容来生成有用的回答。首先,回顾用户提供的引用内容,看看有哪些相关的技巧可以提取。 引用[1]提到使用.gitkeep来提交空文件夹。这在Git中是一个常见问题,因为Git默认不跟踪空文件夹,所以用户可能需要这个技巧。应该详细解释如何操作,并给出具体命令,比如创建.gitkeep文件。 引用[2]展示了实操示例,包括克隆仓库、修改文件、添加更改和检查状态。这部分可以转化为基础操作技巧,比如使用git status -s来查看简短的状态信息,或者如何分步提交更改。 引用[3]提到在提交时忽略某个文件,使用git update-index --assume-unchanged。这个技巧对于临时忽略文件很有用,比如配置文件,但需要提醒用户谨慎使用,并记得恢复跟踪。 引用[4]讨论了Git的全局配置和.gitconfig文件,包括定义别名和修改默认行为。这部分可以扩展为配置优化技巧,比如设置别名节省时间,或者条件包含配置文件。 另外,用户之前的问题是关于Git技巧,所以需要组织这些内容,分门别类,比如基础技巧、高级技巧、配置优化等。同时,要确保回答结构清晰,每个技巧都有说明和示例,符合用户要求的真实可靠。 还要注意用户可能需要的其他技巧,比如暂存部分更改、交互式变基、清理历史等,这些虽然不在引用中,但属于常见的Git技巧,可以补充进去。但需要根据引用内容优先,确保回答紧扣提供的资料。 最后,生成相关问题,帮助用户深入探索,比如如何恢复被忽略的文件,或者如何优化存储库性能。这些问题应基于回答中的技巧,引导用户进一步学习。</think>### Git 使用技巧与高效工作流指南 --- #### 一、基础实用技巧 1. **强制提交空文件夹** Git 默认忽略空文件夹,可通过创建 `.gitkeep` 文件解决: ```bash mkdir empty_folder && touch empty_folder/.gitkeep git add empty_folder/.gitkeep ``` 此文件无实际内容,仅用于占位[^1]。 2. **精准提交部分修改** 使用 `git add -p` 交互式选择代码块提交(避免全文件提交): ```bash git add -p filename # 逐块审查修改内容 ``` 通过 `y/n` 确认或跳过代码块,适合拆分复杂改动[^4]。 3. **临时忽略文件改动** 针对配置文件等敏感内容,临时取消跟踪(不删除文件): ```bash git update-index --assume-unchanged config.yml # 忽略改动 git update-index --no-assume-unchanged config.yml # 恢复跟踪 ``` 适用于开发环境与生产配置分离的场景[^3]。 --- #### 二、高级操作优化 1. **交互式变基(Rebase)** 整理提交历史,合并冗余记录或修改提交信息: ```bash git rebase -i HEAD~3 # 修改最近3条提交 ``` 支持 `squash`(合并)、`edit`(修改)、`drop`(删除)等操作[^4]。 2. **引用日志恢复误删内容** 通过 `git reflog` 找回丢失的提交或分支: ```bash git reflog # 查看操作历史 git reset --hard HEAD@{2} # 恢复到指定操作前的状态 ``` 适用于误删分支、强制推送覆盖等场景。 3. **子模块管理** 嵌套其他仓库时,使用子模块保持独立性: ```bash git submodule add https://github.com/user/repo.git # 添加子模块 git submodule update --init --recursive # 初始化/更新子模块 ``` --- #### 三、配置与别名优化 1. **全局别名简化命令** 在 `~/.gitconfig` 中定义快捷命令: ```ini [alias] st = status -s lg = log --graph --oneline --decorate undo = reset HEAD~1 --soft # 撤销上一次提交但保留改动 ``` 使用 `git st` 替代 `git status -s`。 2. **条件化配置文件** 根据仓库路径自动加载特定配置(如公司项目与个人项目分离): ```ini [includeIf "gitdir:~/work/"] path = .gitconfig-work # 工作专用配置 [includeIf "gitdir:~/personal/"] path = .gitconfig-personal # 个人配置 ``` 3. **优化差异对比** 设置默认 diff 工具与算法提升可读性: ```ini [core] pager = delta # 使用 delta 工具增强高亮 [diff] algorithm = histogram # 更智能的差异检测 ``` --- #### 四、实战场景示例(基于引用[2]) ```bash # 克隆仓库并切换分支 git clone https://github.com/example/repo.git cd repo && git checkout feature-branch # 修改文件后选择性提交 echo "new content" >> file1.txt git add -p file1.txt # 仅提交部分修改 # 忽略临时文件(如日志) git update-index --assume-unchanged debug.log git commit -m "Update core feature" # 恢复文件跟踪 git update-index --no-assume-unchanged debug.log ``` --- #### 五、错误排查与清理 1. **清理历史大文件** 使用 `git filter-branch` 或 `BFG Repo-Cleaner` 移除误提交的大文件: ```bash git filter-branch --tree-filter 'rm -f large_file.zip' HEAD ``` 2. **重置远程仓库状态** 强制推送修正后的历史(谨慎操作): ```bash git push origin main --force # 覆盖远程分支 ``` --- ### 相关问题拓展 1. [如何批量修改历史提交中的作者信息?] 2. [Git Hook 如何自动化代码检查与部署?] 3. [如何利用 Git Bisect 快速定位问题提交?] [^1]: 通过占位文件保留空目录结构 [^2]: 分阶段提交与状态检查操作示例 [^3]: 临时忽略文件改动的应用场景 [^4]: 全局配置与别名优化提升效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值