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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

-Git 使用技巧 总结 MD

發(fā)布時(shí)間:2025/7/25 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 -Git 使用技巧 总结 MD 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 目錄
  • Bash下的快捷操作
    • 常用命令
    • 常用操作
    • 移動(dòng)光標(biāo)
    • 刪除輸入內(nèi)容
    • Tab鍵的作用
  • Git默認(rèn)Vim編輯器基本使用
  • Git 使用場(chǎng)景
    • 合并多個(gè)commit:rebase -i【s】
    • 刪除多個(gè)commit:rebase -i【d】
    • 修改多個(gè)commit:rebase -i【r】
    • 挑選多個(gè)commit:cherry-pick
    • 使用 git branch -d 刪除分支的條件
    • 解決 push 時(shí)提示 Everything up-to-date 問(wèn)題
Markdown版本筆記我的GitHub首頁(yè)我的博客我的微信我的郵箱
MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantao@sina.com

目錄

Bash下的快捷操作

常用命令

  • cd:change directory 改變目錄,不帶參數(shù)時(shí)默認(rèn)進(jìn)入【/c/Users/當(dāng)前用戶】目錄
  • cd ..:回到父目錄
  • cd aaa:進(jìn)入指定目錄,可以是相對(duì)目錄或絕對(duì)目錄
  • pwd:打印工作目錄路徑
  • ls和ll:列出當(dāng)前目錄中的所有文件
  • touch aaa.txt:在當(dāng)前目錄下新建一個(gè)文件
  • mkdir aaa:在當(dāng)前目錄下新建一個(gè)目錄
  • rm aaa.txt:刪除指定的文件
  • rm -r aaa:刪除指定的目錄,參數(shù)r為recusive是遞歸的意思
  • mv aaa.txt bbb:將文件移到指定目錄下
  • q:結(jié)束一個(gè)命令

常用操作

  • 復(fù)制內(nèi)容:選中后就已經(jīng)復(fù)制了(勾選了"選擇時(shí)復(fù)制"),或 Ctrl + Insert
  • 粘貼內(nèi)容:點(diǎn)擊鼠標(biāo)中鍵,或 Shift + Insert
  • 搜索內(nèi)容:Alt + F3,按Enter或Shift + Enter選中下/上一個(gè)匹配內(nèi)容
  • 縮放文字:Ctrl + 【+/-】
  • 窗口清屏:Alt + F8(重置),cmd 下的命令是 cls
  • 窗口全屏:Alt + F11,再按一次還原

移動(dòng)光標(biāo)

  • 一個(gè)字符一個(gè)字符向左/右移動(dòng)光標(biāo):Ctrl + B/F
  • 一個(gè)單詞一個(gè)單詞向左/右移動(dòng)光標(biāo):Alt + B/F
  • 移動(dòng)光標(biāo)到整條命令的起始/結(jié)束位置:Ctrl + A/E(ahead end)

刪除輸入內(nèi)容

  • 刪除光標(biāo)左/右側(cè)的字符:Ctrl + H/D(或backspace鍵、delete鍵)
  • 刪除光標(biāo)左/右側(cè)的單詞:Ctrl + W,Alt + D
  • 刪除光標(biāo)左/右側(cè)的所有內(nèi)容:Ctrl + U/K

Tab鍵的作用

  • 輸入內(nèi)容(文件名或命令)的前幾個(gè)字母時(shí),按tab,如果有內(nèi)容可以匹配,它就會(huì)顯示出完整的內(nèi)容
  • 如果有多個(gè)內(nèi)容匹配到,它會(huì)顯示最先找到的一個(gè),再按一次tab,它就會(huì)匹配的下一個(gè)
  • 我們可以不停地按Tab鍵在匹配的內(nèi)容中來(lái)回切換,直到找到我們文件名為止

Git默認(rèn)Vim編輯器基本使用

Git默認(rèn)的編輯器是Vim,在很多情境下會(huì)遇到它,例如commit提交,如果提供-m指令,直接在后面寫上此次提交的說(shuō)明信息;如果不提供-m指令,默認(rèn)將會(huì)彈出Vim編輯器,如下:

# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit.

此編輯器和平時(shí)所用編輯器差距很大,Vim編輯器命令很多,下面介紹一下簡(jiǎn)單操作,以完成基本的Git操作。

Vim主要有如下兩種模式:

  • Normal 模式:命令模式,按 ESC 或 Ctrl + [ 進(jìn)入,此模式下無(wú)法輸入內(nèi)容,但是可以復(fù)制、黏貼、保存、退出
    • :w表示保存
    • :q表示離開(kāi),如果未保存會(huì)有提示
    • :q!表示不保存離開(kāi)
    • :wq表示保存并離開(kāi)(用的最多)
  • Insert 模式:編輯模式,點(diǎn)擊i、a 或 o 鍵可以進(jìn)入

Git 使用場(chǎng)景

合并多個(gè)commit:rebase -i【s】

基本步驟:

  • 執(zhí)行g(shù)it rebase -i HEAD~影響的最少commit數(shù)或git rebase -i 前一個(gè)commitId
  • 將需要合并的那條commit前面的pick改為s,保存后退出
  • 修改commit日志,保存后退出

以下是詳細(xì)操作


在使用 Git 作為版本控制的時(shí)候,我們可能會(huì)由于各種各樣的原因提交了許多臨時(shí)的 commit,而這些 commit 拼接起來(lái)才是完整的任務(wù)。那么我們?yōu)榱吮苊馓嗟?commit 而造成版本控制的混亂,通常我們推薦將這些 commit 合并成一個(gè)。

首先你要知道自己想合并的是哪幾個(gè)提交,可以使用 git log 命令來(lái)查看提交歷史,假如最近 4 條歷史如下:

commit 8b5cbda494a68582164048159e605e731f357444 (HEAD -> master) commit a472755058e78a33595390f87d03d855fc25da84 commit 6ab13045d47157842961fae70baa7ef25e1856b1 commit 00b8fe51079ac0ba1d5a87e9c0b51c9e851d233f (origin/master, origin/HEAD)

歷史記錄是按照時(shí)間排序的,時(shí)間近的排在前面。

如果想要合并第 2 和第 3 條記錄,有兩個(gè)方法,這兩個(gè)方法效果是一致的:

  • 從HEAD版本開(kāi)始往過(guò)去數(shù) 3 個(gè)版本
git rebase -i HEAD~3
  • 指名要合并的版本之前的版本號(hào)
git rebase -i 00b8fe51079ac0ba1d5a87e9c0b51c9e851d233f

請(qǐng)注意 00b8fe51079ac0ba1d5a87e9c0b51c9e851d233f 這個(gè)版本是不參與合并的,可以把它當(dāng)做一個(gè)坐標(biāo)

執(zhí)行了 rebase 命令之后,會(huì)彈出一個(gè)窗口,內(nèi)容如下:

pick 6ab1304 11111111 pick a472755 222222222 pick 8b5cbda 3333333# Rebase 00b8fe5..8b5cbda onto 00b8fe5 (3 commands) # # Commands: # p, pick = use commit # r, reword(改寫) = use commit, but edit the commit message # e, edit = use commit, but stop for amending(修正) # s, squash(塞入) = use commit, but meld into(融入) previous commit # f, fixup(修正) = like "squash", but discard(丟棄) this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out(被注釋掉的)

可以看到,里面有詳細(xì)的命令提示。我們將需要合并的那條commit前面的pick改為s,之后保存并關(guān)閉文本編輯窗口即可。改完之后文本內(nèi)容如下:

pick 6ab1304 11111111 s a472755 222222222 pick 8b5cbda 3333333

然后保存退出。如果沒(méi)有沖突,或者沖突已經(jīng)解決,則會(huì)出現(xiàn)如下的編輯窗口:

# This is a combination of 2 commits. # This is the 1st commit message:11111111# This is the commit message #2:222222222# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit(空消息會(huì)終止提交). # # Date: Sun Jul 7 21:14:02 2019 +0800 # # interactive(互動(dòng)) rebase in progress; onto 00b8fe5 # Last commands done (2 commands done): # pick 6ab1304 11111111 # squash a472755 222222222 # Next command to do (1 remaining command): # pick 8b5cbda 3333333 # You are currently rebasing branch 'master' on '00b8fe5'. # # Changes to be committed: # modified: build.gradle

如果不做任何修改的話,默認(rèn)是保留兩次 commit 的日志,中間有一個(gè)空白行,你可以隨意修改合并后的日志。

保存并退出后再次輸入 git log 查看 commit 歷史信息,你會(huì)發(fā)現(xiàn)這兩個(gè) commit 已經(jīng)合并了。

commit 9adb987d31f11f8d38f8d817096d2d21a7390a1d (HEAD -> master) commit 052ea3ea0b30c375e79ad9e891c5e5202768b11b commit 00b8fe51079ac0ba1d5a87e9c0b51c9e851d233f (origin/master, origin/HEAD)

雖然我們只是合并了第 2 條和第 3 條的commit,但是第 1 條的 commitId 也變了。

如果有沖突,需要修改。修改的時(shí)候要注意,保留最新的歷史,不然我們的修改就丟棄了。

修改以后要記得敲下面的命令:

git add . git rebase --continue

如果你想放棄這次壓縮的話,執(zhí)行以下命令:

git rebase --abort

刪除多個(gè)commit:rebase -i【d】

和上面的操作基本一致。

例如我的提交歷史如下:

commit 831be8ec644c4943374adca03880732c7ec9d6bd (HEAD -> master) commit 6a8ecb529a4ec6b6e0fc83e0789043b7785e73fe commit 3b228d8af9e52806c106ef3f0c27e622b5407faf commit 9adb987d31f11f8d38f8d817096d2d21a7390a1d (origin/master, origin/HEAD)

我想刪除第2條和第3條提交,基本步驟:

  • 執(zhí)行g(shù)it rebase -i HEAD~影響的最少commit數(shù)或git rebase -i 前一個(gè)commitId
  • 將需要?jiǎng)h除的那幾條commit前面的pick改為d,保存后退出
  • 修改commit日志,保存后退出

注意,這個(gè)操作感覺(jué)出現(xiàn)沖突的概率比較大,例如我上面三次commit都是在同一個(gè)文件的第一行插入一行新的文字:

//添加3 //添加2 //添加1

執(zhí)行rebase后就會(huì)提示沖突了:

git rebase -i 9adb987d31f11f8d38f8d817096d2d21a7390a1d Auto-merging build.gradle CONFLICT (content): Merge conflict in build.gradle error: could not apply 831be8e... 333Resolve all conflicts manually手動(dòng), mark them as resolved with "git add/rm <conflicted_files>", then run "git rebase --continue". You can instead skip this commit: run "git rebase --skip". To abort and get back to the state before "git rebase", run "git rebase --abort".Could not apply 831be8e... 333

解決沖突后按以下操作:

git add . git rebase --continue

可以發(fā)現(xiàn),相應(yīng) commit 都還原了,包括修改的文件以及提交的commit記錄。

修改多個(gè)commit:rebase -i【r】

和上面的操作基本一致。

例如我的提交歷史如下:

commit 442... (HEAD -> master) commit 5a1... commit 305... commit f30... (origin/master, origin/HEAD)

我想修改第2條和第3條提交,基本步驟:

  • 執(zhí)行g(shù)it rebase -i HEAD~影響的最少commit數(shù)或git rebase -i 前一個(gè)commitId
  • 將需要修改的那幾條commit前面的pick改為r,保存后退出
  • 每個(gè)改為reword的提交都會(huì)提示你一個(gè)編輯窗口讓你修改commit日志,修改保存后退出

注意,修改后會(huì)生成新的commitId

挑選多個(gè)commit:cherry-pick

cherry-pick 的翻譯是擇優(yōu)挑選,使用git cherry-pick命令,可以選擇將現(xiàn)有的一個(gè)或者多個(gè)提交的修改引入當(dāng)前內(nèi)容。

cherry-pick 官方文檔

git cherry-pick <commitid> <commitid>

挑選多個(gè)提交合并,提交之間用空格相隔。

git cherry-pick <start-commit>..<end-commit>

挑選一個(gè)范圍內(nèi)的多個(gè)提交合并,不包含start-commit(最早的提交),包含end-commit(最近的提交)。另外要注意兩個(gè) commit 之間要求有連續(xù)關(guān)系的,并且前者要在后者之前,順序不能顛倒。

git cherry-pick <start-commit>^..<end-commit>

這個(gè)和上面一樣,區(qū)別就是加了一個(gè)^符號(hào),就變成閉區(qū)間了,包含 start-commit。

git cherry-pick <branch name>

挑選 branch 最頂端的提交。

git cherry-pick --continue //繼續(xù)下個(gè)操作 git cherry-pick --quit //退出 git cherry-pick --abort //停止本次操作

當(dāng) cherry-pick 多個(gè) commit 時(shí),假設(shè)遇到?jīng)_突:

  • --continue繼續(xù)進(jìn)行下個(gè)
  • --quit結(jié)束 cherry-pick 操作但是不會(huì)影響沖突之前多個(gè)提交中已經(jīng)成功的
  • --abort直接打回原形,回到 cherry-pick 前的狀態(tài),包括多個(gè)提交中已經(jīng)成功的

使用 git branch -d 刪除分支的條件

參考:git branch -d 和 git branch -D 的區(qū)別

結(jié)論:
在使用-d刪除分支時(shí),該分支必須完全和它的上游分支merge完成,如果沒(méi)有上游分支,必須要和HEAD完全merge。

出現(xiàn)的案例一

  • 1、現(xiàn)有一個(gè)本地分支 v0.1,我做一些修改后 commit (沒(méi)有 commit或stash 是不能切換到其他分支的)
  • 2、然后切到其他分支(因?yàn)椴荒軇h除當(dāng)前分支)后刪除 v0.1 試試 ,可以發(fā)現(xiàn)刪除失敗
git branch -d v0.1 error: The branch 'v0.1' is not fully merged. If you are sure you want to delete it, run 'git branch -D v0.1'.

3、然后切到 v0.1 上,將修改推送到遠(yuǎn)端:git push origin v0.1
4、然后再切到其他分支后刪除 v0.1 試試,可以發(fā)現(xiàn)刪除成功,但是有警告

git branch -d v0.1 warning: deleting branch 'v0.1' that has been merged to 'refs/remotes/origin/v0.1', but not yet merged to HEAD. Deleted branch v0.1 (was 4a79623).

上面的步驟進(jìn)行一些優(yōu)化:
4、假如我們后面刪除前是切到了 master 分支,所以當(dāng)前HEAD為 master 分支("所以"這個(gè)詞用的對(duì)嗎?)
5、將 v0.1 上的修改 merge 過(guò)來(lái)git merge v0.1,然后再刪除 v0.1 試試,可以發(fā)現(xiàn)刪除成功且沒(méi)有警告

出現(xiàn)的案例二

  • 1、首先我基于當(dāng)前分支 v0.1 創(chuàng)建了一個(gè)分支 v0.1_copy:git branch v0.1_copy(此分支并沒(méi)有上游分支)
  • 2、然后切到 v0.1_copy 上,并進(jìn)行一些修改,然后 commit
  • 3、然后切到 v0.1 后刪除 v0.1_copy 試試,可以發(fā)現(xiàn)刪除失敗
git branch -d v0.1_copy error: The branch 'v0.1_copy' is not fully merged. If you are sure you want to delete it, run 'git branch -D v0.1_copy'.

5、然后切到 v0.1 上,并將 v0.1_copy 上的修改 merge 過(guò)來(lái)git merge v0.1_copy
6、然后再刪除 v0.1_copy 試試,可以發(fā)現(xiàn)刪除成功且沒(méi)有警告

git branch -d v0.1_copy Deleted branch v0.1_copy (was 03cb1c6).

總結(jié)

簡(jiǎn)單來(lái)說(shuō)就是這么一個(gè)設(shè)計(jì)思想:

  • 如果一個(gè)分支有和遠(yuǎn)端分支關(guān)聯(lián)(有上游分支),那么在刪除此分支前需要將此分支上的commit push到遠(yuǎn)端,不然在分支被刪除時(shí)在其上所做的 commit 也一并被刪除了,設(shè)計(jì)者認(rèn)為這樣的操作風(fēng)險(xiǎn)極大
  • 如果一個(gè)分支沒(méi)有和遠(yuǎn)端分支關(guān)聯(lián)(沒(méi)有上游分支),由于在此分支上的 commit 不能 push 到遠(yuǎn)端,那么為了防止 commit 也一并被刪除了,設(shè)計(jì)者要求必須要和HEAD完全merge才能刪除

總之一句話,刪除分支不能導(dǎo)致有任何已做的 commit 無(wú)法追蹤,如果你想這么做,必須使用 -D 達(dá)到你的目的

解決 push 時(shí)提示 Everything up-to-date 問(wèn)題

參考 stackoverflow 上的答案

1、現(xiàn)在有一個(gè)本地分支 v0.1,且其和遠(yuǎn)端分支 v0.1 關(guān)聯(lián),此時(shí)你在本地 v0.1 做的任何修改都可以通過(guò)git push origin v0.1推到遠(yuǎn)端,這很正常

2、然后你通過(guò)git branch v0.1_backup創(chuàng)建了一個(gè)備份分支,然后 checkout 到此分支后做了一些修改,當(dāng)你 commit 后 push 到遠(yuǎn)端的 v0.1 時(shí)問(wèn)題就出現(xiàn)了

git push origin v0.1 Everything up-to-date

其實(shí)這里的 "Everything up-to-date(最新)", 的含義是:
"all the branches you've told me how to push are up to date".
也就是說(shuō)遠(yuǎn)端的v0.1是最新的

并且此時(shí)其實(shí)并沒(méi)有push到遠(yuǎn)端的

git status On branch v0.1_backup Your branch is ahead of 'origin/v0.1' by 1 commit.

原因是很簡(jiǎn)單的,分支 v0.1_backup 并沒(méi)有和遠(yuǎn)端分支關(guān)聯(lián)

$ git branch -vvmaster de18ed6 [origin/master] 修改1v0.1 03cb1c6 [origin/v0.1] 修改2 * v0.1_backup 88eb433 修改3

3、現(xiàn)在你通過(guò)git branch -u origin/v0.1 v0.1_backup可以將其和遠(yuǎn)端的 v0.1 關(guān)聯(lián)

$ git branch -vvmaster de18ed6 [origin/master] 修改1v0.1 03cb1c6 [origin/v0.1] 修改2 * v0.1_backup 88eb433 [origin/v0.1: ahead 1] 修改3

4、然后再 push 到遠(yuǎn)端的 v0.1 會(huì)發(fā)現(xiàn),問(wèn)題依舊

解決方式有三個(gè)

1、改名,將本地分支名 v0.1_backup 改為和遠(yuǎn)程分支名一樣的 v0.1 就可以了。神馬,同名的分支已存在?那你為什么不在已存在的那個(gè)分支上操作呢?

2、merge,比如上面說(shuō)的和遠(yuǎn)程分支同名的本地分支 v0.1 已存在時(shí),可以先將 v0.1_backup 的修改 merge 到 v0.1 上,然后再在 v0.1 上 push 就可以了。雖然麻煩,但是這是標(biāo)準(zhǔn)操作(個(gè)人感覺(jué))。

3、使用下面的命令也可以

git push origin v0.1_backup:v0.1

2019-7-14

轉(zhuǎn)載于:https://www.cnblogs.com/baiqiantao/p/11111287.html

總結(jié)

以上是生活随笔為你收集整理的-Git 使用技巧 总结 MD的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。