Git是最廣泛使用的分佈式版本控制系統之一,被世界各地的開發者描述為第一大的VCS服務。它只能從終端運行,但有幾個前端可供下載。
它是一個免費且開源的版本控制系統應用程序,可以以最大的效率和速度處理大型和小型項目。該程序可以很容易地描述為小,快速和分佈式。
命令行選項
該程序帶有一些命令,可以從任何人都可以輕鬆記住。所有的操作都是在本地執行的,並且已經被設計為在Linux內核上工作。
包含的命令包括添加,平分,分支,簽出,克隆,提交,差異,提取,grep,初始化,日誌,合併,mv,拉,推,rebase,重置,rm,顯示,狀態和標記。您可以通過從終端窗口運行git --help命令輕鬆了解每個命令的功能。
功能一目了然
使用Git時,用戶將能夠添加文件,簽出分支或路徑,克隆存儲庫,創建空的Git倉庫,加入多個開發歷史記錄,顯示工作樹狀態,記錄更改,以及創建,列出或刪除分支。此外,該應用程序允許用戶查看提交和工作樹之間的變化,匹配模式的打印行,查看提交日誌,下載引用和對象,重命名或移動文件,符號鏈接和目錄,更新遠程引用和刪除來自工作樹的文件。
存在各種圖形前端
即使它只是一個命令行軟件,也可以使用各種圖形用戶界面(GUI),包括git-cola,SmartGit,GitEye,giggle和gitg。該項目超越了SCM(軟件配置管理)實用程序,例如CVS,Subversion,ClearCase和Perforce,具有便宜的本地分支,多個工作流程以及便捷的中轉區域。
底線
總結一下,Git是一個免費的版本控制系統,具有閃電般的性能,易於學習,佔用空間小。使用Git,您可以執行無摩擦的上下文切換,基於角色的代碼行,基於特徵的工作流程以及一次性實驗。
p>在一定的條件下,一個幫助函數讀取單個整行到strbuf錯誤地在EOF觸發OOM錯誤,已經被修復。
除了“cc:#cruft”,“cc:a@dd.re.ss#cruft”之外,被教導為“git send-email”作為一種有效的方式告訴它,它還需要發送一個副本到拖車部分。
不像“git commit-tree”文件“,”git commit-tree -F file“沒有逐字傳遞文件的內容,而是在最後完成了一個不完整的行,如果存在的話。後者已被更新以匹配前者的行為。
除了“cc:#cruft”,“cc:a@dd.re.ss#cruft”之外,被教導為“git send-email”作為一種有效的方式告訴它,它還需要發送一個副本到拖車部分。
不像“git commit-tree”文件“,”git commit-tree -F file“沒有逐字傳遞文件的內容,而是在最後完成了一個不完整的行,如果存在的話。後者已被更新以匹配前者的行為。
2.15.0版本中的新內容:
在一定的條件下,一個幫助函數讀取單個整行到strbuf錯誤地在EOF觸發了OOM錯誤,已經被修復。除了“cc:#cruft”,“cc:a@dd.re.ss#cruft”之外,被教導為“git send-email”作為一種有效的方式告訴它,它還需要發送一個副本到拖車部分。
不像“git commit-tree”文件“,”git commit-tree -F file“沒有逐字傳遞文件的內容,而是在最後完成了一個不完整的行,如果存在的話。後者已被更新以匹配前者的行為。
在版本2.14.1中新增功能:
- 此版本將“修復” SSH://..."來自Git v2.7.6的網址
- Git不知道索引中的內容應該是用“git add -N”添加的路徑,所以“git grep --cached”不應該顯示命中(或者顯示缺少命中,以-L )在這樣的路徑中,但是這個邏輯不適用於“git grep”,即在工作樹文件中搜索。但是我們錯誤地這樣做了,而這個問題已經得到糾正。
- 當操作中止時,“git rebase -i --autostash”沒有恢復自動裝入的更改。
- 沒有任何消息體的提交的“git commit --amend --allow-empty-message -S”可能會錯誤地標識提交對象的頭部結束。
- 更多標記更新來排版預期由最終用戶以固定寬度字體輸入的字符串。
- 很長一段時間,我們進行了一個代碼內的評論,表示只有在Windows上使用fprintf / fput時,我們的彩色輸出才能正常工作,而過去幾年情況已不復存在。
- 當設置為1時,“gc.autoPackLimit”不應該在只有一個包的情況下觸發重新打包,但是代碼計數不佳,並且這樣做。
- “git am”的一個部分有一個古怪的助手功能,叫“他的”外面的東西,而不是叫我們有“我們的”,這不是性別中立的,也不符合系統的其他部分外面的東西通常被稱為“他們的”,而不是“我們的”
- 測試框架學習了一個新的幫助器test_match_signal來檢查退出代碼是否被預期的信號所殺死。
- “git blame -M”錯過了在文件中移動的一行。
- 修復最近引入的並行子模塊操作中涉及的代碼路徑,這些代碼路徑放棄了讀取太早,並且在試圖在角落情況下寫入時浪費CPU。
- “git grep -i”被教會在非ascii語言環境中正確折疊大小寫。
- 無條件使用“mktemp”的測試發現,該命令不一定能在任何地方使用。
- “git blame file”允許檢查“file”的未提交,未加入內容中的行的沿襲,但是當“file”沒有出現在當前提交中時,拒絕它。當通過重命名現有文件而創建“文件”時(但沒有提交更改),這個限制是不必要的。
- 當同一目錄中有其他路徑在“文件”之後排序時,“git add -N dir / file&& git write-tree”
- “git fetch http:// user:pass @ host / repo ...”清理了userinfo部分,但“git push”沒有。
- 導致“git diff --ignore-space-at-eol”行為異常的年齡錯誤已得到修復。
- “git notes merge”有一個代碼來查看路徑是否存在(如果存在則失敗),然後打開寫入路徑(當不存在時)。將其替換為使用O_EXCL打開。
- “git pack-objects”和“git index-pack”大部分是在關於packfile中的對象偏移的時候用off_t來操作的,但是有一些地方使用“unsigned long”來保存這個值,到意外的截斷。
- 最近更新到“git守護進程”嘗試啟用套接字級KEEPALIVE,但是當它通過inetd產生時,標準輸入文件描述符可能不一定連接到套接字。從setsockopt()中抑制ENOTSOCK錯誤。
- 最近的FreeBSD停止在/ usr / bin / perl提供perl;在不太古老的FreeBSD發行版中,將默認的內置路徑切換到/ usr / local / bin / perl。
- “git status”學會在衝突合併期間建議“merge --abort”,就像在已經發生衝突的rebase期間已經暗示“rebase - abort”一樣。
- .c / .h來源在我們的.gitattributes文件中被標記為“git diff -W”,朋友會更好地工作。
- 現有的autoconf生成的測試需要與pthread庫鏈接,沒有檢查pthread庫中的所有函數;最近的FreeBSD在libc中有一些功能,但是沒有其他的功能,我們錯誤地認為在libc的時候連接是不夠的。
- 在Travis CI測試中允許http守護進程測試。
- parse_options_concat()API函數的用戶需要預先分配額外的插槽,並在需要動態地決定支持的選項集時用OPT_END()填充它們,這使得代碼容易出錯且難以閱讀。這已通過調整API來分配並返回“結構選項”數組的新副本
- 在“git rm”中使用strbuf來構建要刪除的文件名有點不理想,已經修復。
- “git commit --help”說“--no-verify”只是跳過預先提交的鉤子,並沒有說它也跳過了commit-msg鉤子。
- “git persistent-https”助手(在contrib /)中的構建過程已經更新,因此可以使用更新版本的Go來構建。
- 在“git diff $ treeA $ treeB”中使用了一個優化方法,在已知與正在比較的blob相同的情況下借用工作樹中已經簽出的副本,並期望這樣的open / mmap一個文件比從對象存儲中讀取文件要快,它涉及到膨脹和應用增量。然而,即使簽出的副本需要經過convert-to-git轉換(包括clean filter),這也會被踢掉,從而導致整個優化過程失敗。當需要轉換時,優化已被禁用。
- “git -c grep.patternType =擴展日誌--basic-regexp”被誤用是因為訪問grep機器的內部API設計不好。
- 由於lstat(2)仿真返回的值缺少inum,所以Windows端口在t4130中失敗了一些測試。
- 標籤/標籤中為“gitweb”輸出提交的標籤中的字符現在可以正確地轉義以獲得正確的HTML輸出。
- 當被問到一個目錄的mtime時,FreeBSD可以說謊,這使得未跟踪的緩存代碼回退到慢速路徑,這反過來又導致t7063的測試失敗,因為它想要驗證快速路徑的行為。
- 靜默編譯器警告netmalloc(在compat /)庫中。
- hashmap的API文檔不清楚,如果hashmap_entry可以安全地丟棄,沒有任何其他的考慮。聲明這樣做是安全的。
- 最近不再重寫“git am”,開始將內部調用提交到提交機制中,意外退步,因為無論應用多少補丁需要多少秒,結果提交的結果提交者時間戳都一樣。
- 在子目錄中啟動的“git difftool ...”無法解釋相對於已修復的目錄的路徑。
使用提交對象的內容並找到其主題行的幫助函數不會忽略前導空白行,正如其他代碼路徑通常所做的那樣。讓它忽略前導空行來匹配。
2.9.1版本中新增功能:
- 當運行“git daemon”而未指定 - [init-]超時時,來自靜默地脫機的客戶端的連接可能會長時間滯留,浪費資源。套接字級KEEPALIVE已經啟用,允許操作系統注意到這種失敗的連接。
- `git log`系列中的命令在自定義格式字符串中使用%C(auto)。無條件地打開顏色,當輸出沒有連接到tty時忽略--no-color或者--color = auto;這被糾正,使格式真正的行為“自動”
- “git rev-list --count”的行走長度受限於“-n”選項,並不適用於優化計數以查看位圖索引。
- “git show -W”(擴展hunks以覆蓋整個函數,由匹配“funcname”模式的行分隔)用於顯示整個文件,當更改在文件末尾添加了一個完整的函數時已被修復。
- 文檔集已更新,因此文字命令,配置變量和環境變量始終以固定寬度字體排版,在聯機幫助頁中以粗體顯示。
- 現在記錄在2.3天內添加的“git svn propset”子命令。
- 文件試圖堅持拼寫“GPG”;當提到具體的程序名時,使用“gpg”。
- 在查看表示分支創建事件(又名“未出生”)的條目後,“git reflog”停止,這使得看起來好像reflog被截斷。
- git-prompt scriptlet(在contrib /中)對那些使用“set -u”(已經修復)的用戶不友好。
- 使用alloca(3)在堆棧上放置大量數據的代碼路徑已經更新,以避免這樣做。
- “git update-index --add --chmod = + x file”可能可以用作逃生艙口,但對於那些需要定期使用的人來說並不是一件友善的事情。可以使用“git add --chmod = + x file”。
- 為gnome-keyring(在contrib /)中構建改進
- “git status”用來表示“工作目錄”,意思是“正在工作的目錄樹”。
- 有關FreeBSD shell不正常的評論已經通過版本號(9.x和之前的版本已經被破解,新的版本都可以)澄清。
- “git cherry-pick A”在未出生的分支上工作,但“git cherry-pick A..B”沒有。
- “git add -i / -p”學會了遵守diff.compactionHeuristic實驗旋鈕,以便用戶可以像“git diff”輸出一樣工作。
- “log --graph --format =”了解到“%> |(N)”指定了相對於終端左邊緣的寬度,而不是相對於繪製祖先右側文本的區域 - 章節。它現在也接受負N,這意味著列限制是相對於右邊界。
- 持有引用的內存塊的所有權規則在“git fetch”中被提取出來,是已經被清理乾淨的。
- 當bisection找到罪魁禍首時,“git bisect”會內部調用“git diff-tree”,但是這個調用並沒有初始化數據結構以正確傳遞到diff-tree API。
- 我們使用GPG簽名的各種數據格式(以及如何驗證它們)已經記錄在案。
- 修復v2.9中的意外回歸,通過強制子模塊也被淺層克隆,從而中斷了“clone --depth”向子模塊遞歸,而子模塊上游的許多服務器實例沒有被準備好。 / LI>
- 修正“:$ {VAR = default}”習慣用法中不必要的浪費,以設置默認值,而不用雙引號括起來。
- 一些特定於平台的代碼具有非ANSI嚴格的C函數聲明,它們沒有採取任何參數,並已得到糾正。
- 用於顯示本地時區偏移量的內部代碼不准備處理2100年以後的時間戳,並給調用者一個偽造的偏移值。使用一個更溫和的+0000來代替,讓“git日誌”在這種情況下,而不是中止。
- 在我們的測試套件中,readlink(1)的四個調用之一被重寫了,這樣測試可以在沒有命令的系統上運行(其他的在valgrind測試框架和t9802中)。
- 在詳細模式下運行時導致“git p4”的錯誤報告由於分支前綴而被忽略的路徑已被修正;該命令對於_inside _。 的路徑說了“忽略前綴之外的文件”
- 頂層文檔“git help git”仍然指向現在已經停用的Google代碼庫中的文檔集。將其更新為指向https://git.github.io/htmldocs/git.html。
t / perf在GNU擴展中需要/ usr / bin / time;它的調用在達爾文更新為“gtime”。
2.9.0版中的新功能:
GIT 2.8.1(2016年4月5日)
2.8.1版中的新增功能:
- “make rpmbuild”目標被破壞,因為它的輸入git.spec.in沒有被更新以匹配它描述的最近被重命名的文件。這已被修復。
在2.7.3版本中新增功能:
- 在寫入我們的內部異步過程時處理錯誤已經變得更加健壯,這樣可以減少我們測試中的片面性。
- “git show”HEAD:Foo [BAR] Baz'“沒有將參數解釋為rev,即樹對像中由通配符指定的對象。
- 從子目錄運行時,工作樹功能中使用的“git rev-parse --git-common-dir”出現故障。
- 當命令在C中被重寫時,交互式“git am -i”命令的“v(iew)”子命令在2.6.0時間框架中被中斷。
- “git merge-tree”用來錯誤地處理“雙方增加”與自己衝突的“創建一個具有雙方共同部分的假祖先文件,並進行三方合併”的邏輯;這已經被更新為在系統的其他部分使用通常的“與一個空的blob作為假共同祖先文件的三路合併”方法。
- fill_textconv()API的內存所有權規則有點棘手,已經被證明更好一些。
- 當沒有設置push.default配置時,文檔沒有明確說明“簡單”模式現在是“git push”的默認模式。
- 輔助函數“git submodule”從v2.7.0開始使用,列出與給其子命令(例如“submodule add”)的pathspec參數匹配的模塊。
- 在每個存儲庫配置文件中設置一個值時,git config section.var value失敗,當它在任何存儲庫之外運行時,卻沒有正確說出原因。 使用包idx文件中存儲的偏移量來讀取包數據的代碼已經被更仔細地檢查了idx中數據的有效性。
傳統上,嘗試對工作樹中的內容起作用的命令的測試在其文件名中用“worktree”命名,但是最近增加了“git worktree”子命令,其測試也被命名為類似的命令變得難以分辨。傳統的測試已經重新命名為使用“工作樹”來試圖區分它們。
許多代碼路徑忘記檢查來自git_config_set()的返回值;該函數被設置為die(),以確保在設置配置變量失敗時不會繼續。
當他們的輸入包含任意的二進制數據時,最近版本的GNU grep是挑剔的,我們的一些測試使用這些數據。重寫測試來避開這個問題。
在2.7.2版本中,
新增功能:
- 在將衝突標記插入本身以CRLF行終止的合併內容時,已經教導低級合併機制使用CRLF行終止。
- “git worktree”有一個破解的代碼,試圖自動修復最終用戶在不告訴Git的情況下將工作樹移動到不同地方的可能不一致(原始存儲庫需要將後台指針保存到其工作區,但是“mv”由不熟悉這一事實的最終用戶運行顯然不會調整它們),這實際上在觸發時使事情變得更糟。
- “git push --force-with-lease”已被教導報告是否需要強制執行(或快進)。
- 在我們的測試腳本中使用的模擬的“是”命令已經被調整,不會花費太多的時間來產生不使用的不必要的輸出,以幫助那些在Windows上進行測試的人不會停下來,直到填充管道緩衝區缺少SIGPIPE。
- “git mergetool”的vimdiff後端已經被調整,按照與大多數從左到右閱讀的人的期望相匹配的順序排列和編號緩衝區,然後從上到下分配緩衝區1 2 3 4“精神上”到本地基地遠程合併窗口根據該命令。
- “git clean”的文檔已更正;它提到.git / modules / *通過提供兩個“-f”來刪除,這是從來沒有的。
- 索引中關於“add -N”的路徑目前尚未完全顯示在索引中,但是一些命令的行為就好像已經是有害的。
- 還包含小文檔和測試更新。
2.6.4版中的新功能:
- “configure”腳本沒有正確地測試-lpthread,這使一些連接器變得困難。
- 添加支持通過socks proxy與http / https通話。
- Windows的可移植性修復程序,可能會使用非POSIX路徑重寫$ SHELL變量。
- 我們現在一直允許所有鉤子忽略它們的標準輸入,而不是讓git抱怨SIGPIPE。
- 在contrib腳本中修復shell引用。
- 測試v2.6.1中的主題的可移植性修復。
- 允許在某些http配置變量中進行波浪擴展。
- 給出一個有用的特例“diff / show --word-diff-regex =。”作為文檔中的示例。
- 修復filter-branch中的一個角落案例。
- 讓git-p4在分離的頭上工作。
- 不帶“--verbose”的文件澄清“check-ignore”。
- 當用戶在P4Submit.applyCommit()中取消提交時,就像清理工作樹一樣,如果“p4 submit”失敗,清理混亂。
- 存儲庫中沒有相應的.pack文件的剩餘.idx文件會影響性能; “git gc”學會修剪它們。 為“dir-diff”特性準備臨時目錄的工作樹端的代碼忘記了不需要將符號鏈接複製(或者符號鏈接)到臨時區域,因為代碼已經是特殊情況並且被覆蓋他們。此外,嘗試計算符號鏈接目標的對象名稱是錯誤的,甚至可能不存在或可能是目錄。
- 沒有辦法從命令行中擊敗已配置的rebase.autostash變量,因為缺少“git rebase --no-autostash”。
- 允許“git interpret-trailers”在Git倉庫之外運行。
- 為shell提示生成正確的“臟”標記,即使我們處於孤兒或未出生的分支上。
- 在“git status”中完成了一些字符串匹配的修正。
- 蘋果公司SHA1_Update()的通用加密實現一次不超過4GB,現在我們有一個編譯時的解決方法。
2.5.3版本中的新增功能:
- 當包含少量子目錄的路徑被涉及時,實驗性的未追踪高速緩存功能是有問題的。
- 腳本化的“git am”的最新版本在“git am --skip”代碼路徑中有一個性能回歸,它不再存在於“master”前面的內置版本中。修復在2.5.x維護軌道和更舊版本中出現的最後腳本版本的回歸。
在2.4.6版本中新增功能:
- “git fetch --depth =”和“git clone --depth =”甚至對不支持該功能的上傳數據包發出淺轉移請求。
- “git fsck”用於忽略記錄在reflog中的丟失或無效對象。
- tcsh完成寫入bash scriptlet,但是對於noclobber設置的用戶將會失敗。
- 最近的Mac OS X更新打破邏輯檢測機器在pre-auto-gc腳本示例中的交流電源。
- “git format-patch --ignore-if-upstream A..B”不喜歡將標籤作為邊界提交。
- 還包含typofixes,文檔更新和普通代碼
- 清理工作。
2.4.2版本中新增功能:
- “git rev-list --objects $ old --not --all”來查看從$ old到達的所有東西是否已經連接到現有的refs是非常低效的。
- v2.2中引入的“hash-object --literally”沒有準備好採用一個非常長的對像類型名稱。
- 當無事可做時,“git rebase - quiet”並不是很安靜。
- “log --decorate =”參數值的填寫不正確。
- “filter-branch”已損壞的提交日誌消息以一些不完整的行結束,其中一些“sed”實現將這種行結合在一起。通過避免使用“sed”來解決它。
- “git daemon”無法在NO_IPV6配置(源於2.4中的回退)下從源代碼構建。
- “git stash pop / apply”忘了確保不僅乾淨的工作樹,而且索引是乾淨的。後者是非常重要的,因為存儲應用程序可能會發生衝突,並且該索引將用於衝突解決。
- 當調用幾乎永恆的子程序和鉤子時,我們已經預先設置了$ GIT_EXEC_PATH和路徑“git”(通常是“/ usr / bin”),但是後者試圖支持的原始用例是半-bogus(即,將git安裝到/ opt / foo / git並運行它,而不需要在$ PATH上有/ opt / foo),更重要的是,它變得越來越不重要,因為Git越來越成為主流(即用戶願意擁有它在他們的$ PATH)。停止將“git”安裝到用戶的$ PATH的路徑,因為這將乾擾人們依賴的命令搜索順序(例如,他們可能不喜歡與/ usr / bin中的Git無關的程序版本,並且希望通過在/ usr / local / bin中使用不同的目錄覆蓋它們,並且在$ PATH的前面加入後面的目錄)。
- 還包含typofixes,文檔更新和簡單的代碼清理。
評論沒有發現