日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧

發布時間:2024/9/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊“小詹學Python”,選擇“置頂”公眾號

重磅干貨,第一時間送達

本文轉載自機器之心,禁二次轉載


Git 是世界上最好用的代碼版本控制工具,沒有之一;那么作為走在前沿的 ML 開發者,豈能不擅長高端大氣上檔次的 Git?

本文介紹了七十多種常用的 Git 命令與技巧,項目作者削微寒在開源工作上也做了非常多的貢獻。目前 Git 奇技淫巧項目已經獲得了 6.8K 的 Star,他還構建了另一個 1.1W+ 的開源項目集錦 HellowGitHub。


  • Git 項目地址:https://github.com/521xueweihan/git-tips

  • HelloGitHub 項目地址:https://github.com/521xueweihan/HelloGitHub


Git 是一個「分布式版本管理工具」,版本管理工具即:我們在寫文章的時候都用「撤」這個功能,但只能做做到回撤幾步,假如想要找到三天前的更改記錄,光用「撤」是不行的。而「版本管理工具」能記載每次的更改痕跡,只要上傳到版本倉庫,我們就能找到之前任何時刻的文本狀態。


對于 ML 開發者而言,版本控制也是必不可少的。如果我們寫了個初版模型,并上傳至 GitHub 私人或公共倉庫,那么每當我們有一些更改,都可以通過 Git 上傳,它會自動控制這些歷史版本。如果說后面發現前面的某些超參數或結構非常好,那么查看歷史版本也是很好的。


對于其它開源工作的管理,Git 就更好用了。因為它是一種分布式版本控制系統,并沒有一個真正的「中心服務器」,所以不同的電腦間有相同的版本庫,本地版本庫損壞了就直接從其它完好的版本庫復制。這種 Git,才是協作開發代碼的最優方法,因此基于 Git 的 GitHub 才成為開源世界中不可獲取的部分。


下面,文章主要就是列舉了常用的 Git 命令和小技巧,讀者可以在原 GitHub 項目上進行頁面內查找,也可以在微信文章頁面上選擇搜索頁面內容


開卷必讀


如果之前未了解過 Git,可以看看這一個 Git 小白教程:http://rogerdudler.github.io/git-guide/index.zh.html。


1. 一定要先測試 Git 命令的效果,再用于工作環境,以防造成不可彌補的后果!

2. 所有命令都在 git version 2.7.4 (Apple Git-66) 環境下測試通過

3. 統一概念:


  • 工作區:增刪文件和內容

  • 暫存區:鍵入命令 git add 改動的文件,此次改動就放到了 『暫存區』

  • 本地倉庫 :鍵入命令 git commit ,此次改動就放到了本地倉庫』,每個 commit,我叫它為一個 『版本』。

  • 遠程倉庫:鍵入命令 git push 到遠程倉庫,此次改動就放到了 『遠程倉庫』。

  • commit-id:輸出命令 git log,最上面那行 commit xxxxxx,后面的字符串即 commit-id。


4. 如果喜歡這個項目,歡迎 Star、Pr,并反饋問題。


先給一張各種命令的詳解圖,更詳細的內容可查閱后文的命令解釋:



為了方便查閱,這里先以目錄的形式列舉各種操作的列表:


  • 顯示幫助信息

  • 返回遠程倉庫的狀態

  • 重設第一個 commit

  • 顯示工作區和暫存區的不同

  • 顯示暫存區和最近版本的不同

  • 顯示暫存區、工作區和最近版本的不同

  • 快速切換到上一個分支

  • 移除已經合并到 master 的分支

  • 顯示本地分支關聯遠程倉庫的情況

  • 關聯遠程分支

  • 舉出所有遠程分支

  • 舉出本地和遠程分支

  • 構建并切換到本地分支

  • 從遠程分支中構建并切換到本地分支

  • 移除本地分支

  • 移除遠程分支

  • 重命名本地分支

  • 查看標簽

  • 查看標簽詳細信息

  • 本地構建標簽

  • Push標簽到遠程倉庫

  • 移除本地標簽

  • 移除遠程標簽

  • 切回到某個標簽

  • 放棄工作區的更改

  • 恢復移除的文件

  • 以新增一個 commit 的方式還原某一個 commit 的更改

  • 回到某個 commit 的狀態,并移除后面的 commit

  • 更改上一個 commit 的描述

  • 查看 commit 歷史

  • 顯示本地更新過 HEAD 的 git 命令記錄

  • 更改作者名

  • 更改遠程倉庫的 url

  • 增加遠程倉庫

  • 舉出所有遠程倉庫

  • 查看兩個星期內的改動

  • 把 A 分支的某一個 commit,放到 B 分支上

  • 給 git 命令起別名

  • 保存當前的更改,但不用提交 commit

  • 儲存當前狀態,包括 untracked 的文件

  • 顯示所有 stashes

  • 回到某個 stash 的狀態

  • 回到最后一個 stash 的狀態,并移除這個 stash

  • 移除所有的 stash

  • 從 stash 中拿出某個文件的更改

  • 顯示所有 tracked 的文件

  • 顯示所有 untracked 的文件

  • 顯示所有忽略的文件

  • 強制移除 untracked 的文件

  • 強制移除 untracked 的目錄

  • 顯示簡化的 commit 歷史

  • 查看某段代碼的貢獻者

  • 把某一個分支到導出成一個文件

  • 從包中導入分支

  • 執行 rebase 之前自動 stash

  • 從遠程倉庫根據 ID,拉下某一狀態,到本地分支

  • 詳細顯示一行中的更改

  • 清除 .gitignore 文件中記錄的文件

  • 顯示所有 alias 和 configs

  • 顯示忽略的文件

  • commit 歷史中顯示 Branch1 有的,但是 Branch2 沒有 commit

  • 在 commit log 中顯示 GPG 簽名

  • 移除全局設置

  • 新建并切換到新分支上,同時這個分支沒有任何 commit

  • 顯示任意分支某一文件的內容

  • clone 下來指定的單一分支

  • 忽略某個文件的改動

  • 忽略文件的權限變化

  • 以最后提交的順序舉出所有 Git 分支

  • 在 commit log 中查找相關內容

  • 把暫存區的指定 file 放到工作區中

  • 強制Push


詳解 Git 奇技淫巧


顯示幫助信息


git help -g


輸出如下:

The common Git guides are: attributes Defining attributes per path cli Git command-line interface and conventions core-tutorial A Git core tutorial for developers cvs-migration Git for CVS users diffcore Tweaking diff output everyday A useful minimum set of commands for Everyday Git glossary A Git Glossary hooks Hooks used by Git ignore Specifies intentionally untracked files to ignore modules Defining submodule properties namespaces Git namespaces repository-layout Git Repository Layout revisions Specifying revisions and ranges for Git tutorial A tutorial introduction to Git tutorial-2 A tutorial introduction to Git: part two workflows An overview of recommended workflows with Git

'git help -a' and 'git help -g' list available subcommands and some concept guides. See 'git help <command>' or 'git help <concept>' to read about a specific subcommand or concept.


回到遠程倉庫的狀態


拋棄本地所有的更改,回到遠程倉庫的狀態。

git?fetch?--all?&&?git?reset?--hard?origin/master


重設第一個 commit


也就是把所有的改動都重新放回工作區,并清空所有的 commit,這樣就可以重新提交第一個 commit 了。

git update-ref -d HEAD


顯示工作區和暫存區的不同


輸出工作區和暫存區的 different (不同)。

git diff


還可以顯示本地倉庫中任意兩個 commit 之間的文件變動:

git diff <commit-id> <commit-id>


顯示暫存區和最近版本的不同


輸出暫存區和本地最近的版本 (commit) 的 different(不同)。

git diff --cached


顯示暫存區、工作區和最近版本的不同


輸出工作區、暫存區 和本地最近的版本 (commit) 的 different (不同)。

git?diff?HEAD


快速切換到上一個分支

git?checkout?-


移除已經合并到 master 的分支

git?branch?--merged?master?|?grep?-v?'^*|?master'?|?xargs?-n?1?git?branch?-d


顯示本地分支關聯遠程倉庫的情況

git?branch?-vv


關聯遠程分支


關聯之后,git branch -vv 就可以顯示關聯的遠程分支名了,同時?Push 到遠程倉庫直接:git push,不需要指定遠程倉庫了。

git?branch?-u?origin/mybranch


或者在 push 時加上 -u 參數

git?push?origin/mybranch?-u


舉出所有遠程分支


-r 參數相當于:remote

git?branch?-r


舉出本地和遠程分支


-a 參數相當于:all

git?branch?-a


構建并切換到本地分支

git?checkout?-b?<branch-name>


從遠程分支中構建并切換到本地分支

git?checkout?-b?<branch-name>?origin/<branch-name>


移除本地分支

git?branch?-d?<local-branchname>


移除遠程分支

git?push?origin?--delete?<remote-branchname>


或者


git?push?origin?:<remote-branchname>


重命名本地分支

git?branch?-m?<new-branch-name>


查看標簽

git?tag


顯示當前分支的最近的 tag

git?describe?--tags?--abbrev=0


查看標簽詳細信息

git?tag?-ln


本地構建標簽

git?tag?<version-number>


默認 tag 是打在最近的一次 commit 上,如果需要指定 commit 打 tag:

$?git?tag?-a?<version-number>?-m?"v1.0?發布?(描述)"?<commit-id>


Push?標簽到遠程倉庫


首先要保證本地構建好了標簽才可以?Push?標簽到遠程倉庫:

git?push?origin?<local-version-number>


一次性?Push 所有標簽,同步到遠程倉庫:

git?push?origin?--tags


移除本地標簽

git?tag?-d?<tag-name>


移除遠程標簽


移除遠程標簽需要先移除本地標簽,再執行下面的命令:

git?push?origin?:refs/tags/<tag-name>


切回到某個標簽


一般上線之前都會打 tag,就是為了防止上線后出現問題,方便快速回退到上一版本。下面的命令是回到某一標簽下的狀態:

git?checkout?-b?branch_name?tag_name


放棄工作區的更改

git?checkout?<file-name>


放棄所有更改

git?checkout?.


恢復移除的文件

git?rev-list?-n?1?HEAD?--?<file_path>?#?得到?deleting_commitgit checkout <deleting_commit>^ -- <file_path> # 回到移除文件 deleting_commit 之前的狀態


以新增一個 commit 的方式還原某一個 commit 的更改

git revert <commit-id>


回到某個 commit 的狀態,并移除后面的 commit


和 revert 的區別:reset 命令會抹去某個 commit id 之后的所有 commit

git?reset?<commit-id>?# 默認就是-mixed 參數。git?reset?–mixed?HEAD^?# 回退至上個版本,它將重置 HEAD 到另外一個 commit, 并且重置暫存區以便和 HEAD 相匹配,但是也到此為止。工作區不會被更改。git?reset?–soft?HEAD~3?# 回退至三個版本之前,只回退了 commit 的信息,暫存區和工作區與回退之前保持一致。如果還要提交,直接 commit 即可git reset –hard <commit-id> # 徹底回退到指定 commit-id 的狀態,暫存區和工作區也會變為指定 commit-id 版本的內容


更改上一個 commit 的描述


如果暫存區有改動,同時也會將暫存區的改動提交到上一個 commit

git commit --amend


查看 commit 歷史

git log


查看某段代碼的貢獻者


blame 的意思為『責怪』,你懂的。

git blame <file-name>


顯示本地更新過 HEAD 的 git 命令記錄


每次更新了 HEAD 的 git 命令比如 commint、amend、cherry-pick、reset、revert 等都會被記錄下來(不限分支),就像 shell 的 history 一樣。這樣你可以 reset 到任何一次更新了 HEAD 的操作之后,而不僅僅是回到當前分支下的某個 commit 之后的狀態。

git reflog


更改作者名

git?commit?--amend?--author='Author?Name?<email@address.com>'


更改遠程倉庫的 url

git remote set-url origin <URL>


增加遠程倉庫

git remote add origin <remote-url>


舉出所有遠程倉庫

git remote


查看兩個星期內的改動

git whatchanged --since='2 weeks ago'


把 A 分支的某一個 commit,放到 B 分支上


這個過程需要 cherry-pick 命令,參考:http://sg552.iteye.com/blog/1300713#bc2367928

git?checkout?<branch-name>?&&?git?cherry-pick?<commit-id>


給 git 命令起別名


簡化命令

git?config?--global?alias.<handle>?<command>比如:git status 改成 git st,這樣可以簡化命令git config --global alias.st status


保存當前的更改,但不用提交 commit


詳解可以參考廖雪峰老師的 git 教程 (http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137602359178794d966923e5c4134bc8bf98dfb03aea3000)

git stash


儲存當前狀態,包括 untracked 的文件


untracked 文件:新建的文件

git stash -u


顯示所有 stashes

git stash list


回到某個 stash 的狀態

git stash apply <stash@{n}>


回到最后一個 stash 的狀態,并移除這個 stash

git stash pop


移除所有的 stash

git stash clear


從 stash 中拿出某個文件的更改

git checkout <stash@{n}> -- <file-path>


顯示所有 tracked 的文件

git ls-files -t


顯示所有 untracked 的文件

git ls-files --others


顯示所有忽略的文件

git?ls-files?--others?-i?--exclude-standard


強制移除 untracked 的文件


可以用來移除新建的文件。如果不指定文件文件名,則清空所有工作的 untracked 文件。clean 命令,注意兩點:


1. clean 后,移除的文件無法找回

2. 不會影響 tracked 的文件的改動,只會移除 untracked 的文件

git?clean?<file-name>?-f


強制移除 untracked 的目錄


可以用來移除新建的目錄,注意:這個命令也可以用來移除 untracked 的文件。詳情見上一條。

git clean <directory-name> -df


顯示簡化的 commit 歷史

git?log?--pretty=oneline?--graph?--decorate?--all


把某一個分支導出成一個文件

git?bundle?create?<file>?<branch-name>


從包中導入分支


新建一個分支,分支內容就是上面 git bundle create 命令導出的內容

git?clone?repo.bundle?<repo-dir>?-b?<branch-name>


執行 rebase 之前自動 stash

git?rebase?--autostash


從遠程倉庫根據 ID,拉下某一狀態,到本地分支

git?fetch?origin?pull/<id>/head:<branch-name>


詳細顯示一行中的更改

git?diff?--word-diff


清除 gitignore 文件中記錄的文件

git?clean?-X?-f


顯示所有 alias 和 configs


注意:config 分為:當前目錄(local)和全局(golbal)的 config,默認為當前目錄的 config

git config --local --list (當前目錄)git config --global --list (全局)


顯示忽略的文件

git?status?--ignored


commit 歷史中顯示 Branch1 有的,但是 Branch2 沒有 commit

git?log?Branch1?^Branch2


在 commit log 中顯示 GPG 簽名

git?log?--show-signature


移除全局設置

git?config?--global?--unset?<entry-name>


新建并切換到新分支上,同時這個分支沒有任何 commit


相當于儲存更改,但是重寫 commit 歷史

git?checkout?--orphan?<branch-name>


顯示任意分支某一文件的內容

git?show?<branch-name>:<file-name>


clone 下來指定的單一分支

git?clone?-b?<branch-name>?--single-branch?https://github.com/user/repo.git


忽略某個文件的改動


關閉 track 指定文件的改動,也就是 Git 將不會在記錄這個文件的改動

git?update-index?--assume-unchanged?path/to/file


恢復 track 指定文件的改動

git?update-index?--no-assume-unchanged?path/to/file


忽略文件的權限變化


不再將文件的權限變化視作改動

git?config?core.fileMode?false


以最后提交的順序舉出所有 Git 分支


最新的放在最上面

git?for-each-ref?--sort=-committerdate?--format='%(refname:short)'?refs/heads/


在 commit log 中查找相關內容


通過 grep 查找,given-text:所需要查找的字段

git?log?--all?--grep='<given-text>'


把暫存區的指定 file 放到工作區中


不添加參數,默認是 -mixed

git?reset?<file-name>


強制?Push

git?push?-f?<remote-name>?<branch-name>


推薦閱讀:某坤學學吳亦凡,Python可視化分析「大碗寬面」b站彈幕和網易云音樂評論


總結

以上是生活随笔為你收集整理的走在前沿的弄潮儿,怎能不会Git的那些奇技淫巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。