緩存一致性forward命令
❶ linux 內核參數優化
一、Sysctl命令用來配置與顯示在/proc/sys目錄中的內核參數.如果想使參數長期保存,可以通過編輯/etc/sysctl.conf文件來實現。
命令格式:
sysctl [-n] [-e] -w variable=value
sysctl [-n] [-e] -p (default /etc/sysctl.conf)
sysctl [-n] [-e] –a
常用參數的意義:
-w 臨時改變某個指定參數的值,如
# sysctl -w net.ipv4.ip_forward=1
-a 顯示所有的系統參數
-p從指定的文件載入系統參數,默認從/etc/sysctl.conf 文件中載入,如:
以上兩種方法都可能立即開啟路由功能,但如果系統重啟,或執行了
# service network restart
命令,所設置的值即會丟失,如果想永久保留配置,可以修改/etc/sysctl.conf文件,將 net.ipv4.ip_forward=0改為net.ipv4.ip_forward=1
二、linux內核參數調整:linux 內核參數調整有兩種方式
方法一:修改/proc下內核參數文件內容,不能使用編輯器來修改內核參數文件,理由是由於內核隨時可能更改這些文件中的任意一個,另外,這些內核參數文件都是虛擬文件,實際中不存在,因此不能使用編輯器進行編輯,而是使用echo命令,然後從命令行將輸出重定向至 /proc 下所選定的文件中。如:將 timeout_timewait 參數設置為30秒:
參數修改後立即生效,但是重啟系統後,該參數又恢復成默認值。因此,想永久更改內核參數,需要修改/etc/sysctl.conf文件
方法二.修改/etc/sysctl.conf文件。檢查sysctl.conf文件,如果已經包含需要修改的參數,則修改該參數的值,如果沒有需要修改的參數,在sysctl.conf文件中添加參數。如:
net.ipv4.tcp_fin_timeout=30
保存退出後,可以重啟機器使參數生效,如果想使參數馬上生效,也可以執行如下命令:
三、sysctl.conf 文件中參數設置及說明
proc/sys/net/core/wmem_max
最大socket寫buffer,可參考的優化值:873200
/proc/sys/net/core/rmem_max
最大socket讀buffer,可參考的優化值:873200
/proc/sys/net/ipv4/tcp_wmem
TCP寫buffer,可參考的優化值: 8192 436600 873200
/proc/sys/net/ipv4/tcp_rmem
TCP讀buffer,可參考的優化值: 32768 436600 873200
/proc/sys/net/ipv4/tcp_mem
同樣有3個值,意思是:
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力.
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段.
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket.
上述內存單位是頁,而不是位元組.可參考的優化值是:786432 1048576 1572864
/proc/sys/net/core/netdev_max_backlog
進入包的最大設備隊列.默認是300,對重負載伺服器而言,該值太低,可調整到1000
/proc/sys/net/core/somaxconn
listen()的默認參數,掛起請求的最大數量.默認是128.對繁忙的伺服器,增加該值有助於網路性能.可調整到256.
/proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默認10K
/proc/sys/net/ipv4/tcp_max_syn_backlog
進入SYN包的最大請求隊列.默認1024.對重負載伺服器,可調整到2048
/proc/sys/net/ipv4/tcp_retries2
TCP失敗重傳次數,默認值15,意味著重傳15次才徹底放棄.可減少到5,盡早釋放內核資源.
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
這3個參數與TCP KeepAlive有關.默認值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某個TCP連接在idle 2個小時後,內核才發起probe.如果probe 9次(每次75秒)不成功,內核才徹底放棄,認為該連接已失效.對伺服器而言,顯然上述值太大. 可調整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3
/proc/sys/net/ipv4/ip_local_port_range
指定埠范圍的一個配置,默認是32768 61000,已夠大.
net.ipv4.tcp_syncookies = 1
表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_keepalive_time = 1200
表示當keepalive起用的時候,TCP發送keepalive消息的頻度。預設是2小時,改為20分鍾。
net.ipv4.ip_local_port_range = 1024 65000
表示用於向外連接的埠范圍。預設情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192
表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網路連接數。
net.ipv4.tcp_max_tw_buckets = 5000
表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並列印警告信息。默認為 180000,改為 5000。對於Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid伺服器被大量的TIME_WAIT套接字拖死。
Linux上的NAT與iptables
談起Linux上的NAT,大多數人會跟你提到iptables。原因是因為iptables是目前在linux上實現NAT的一個非常好的介面。它通過和內核級直接操作網路包,效率和穩定性都非常高。這里簡單列舉一些NAT相關的iptables實例命令,可能對於大多數實現有多幫助。
這里說明一下,為了節省篇幅,這里把准備工作的命令略去了,僅僅列出核心步驟命令,所以如果你單單執行這些沒有實現功能的話,很可能由於准備工作沒有做好。如果你對整個命令細節感興趣的話,可以直接訪問我的《如何讓你的Linux網關更強大》系列文章,其中對於各個腳本有詳細的說明和描述。
EXTERNAL="eth0"
INTERNAL="eth1"
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $EXTERNAL -j MASQUERADE
LOCAL_EX_IP=11.22.33.44 #設定網關的外網卡ip,對於多ip情況,參考《如何讓你的Linux網關更強大》系列文章
LOCAL_IN_IP=192.168.1.1 #設定網關的內網卡ip
INTERNAL="eth1" #設定內網卡
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -t nat -A PREROUTING -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10
iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp --dport 80 -j SNAT --to $LOCAL_IN_IP
iptables -A FORWARD -o $INTERNAL -d 192.168.1.10 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A OUTPUT -d $LOCAL_EX_IP -p tcp --dport 80 -j DNAT --to 192.168.1.10
獲取系統中的NAT信息和診斷錯誤
了解/proc目錄的意義
在Linux系統中,/proc是一個特殊的目錄,proc文件系統是一個偽文件系統,它只存在內存當中,而不佔用外存空間。它包含當前系統的一些參數(variables)和狀態(status)情況。它以文件系統的方式為訪問系統內核數據的操作提供介面
通過/proc可以了解到系統當前的一些重要信息,包括磁碟使用情況,內存使用狀況,硬體信息,網路使用情況等等,很多系統監控工具(如HotSaNIC)都通過/proc目錄獲取系統數據。
另一方面通過直接操作/proc中的參數可以實現系統內核參數的調節,比如是否允許ip轉發,syn-cookie是否打開,tcp超時時間等。
獲得參數的方式:
第一種:cat /proc/xxx/xxx,如 cat /proc/sys/net/ipv4/conf/all/rp_filter
第二種:sysctl xxx.xxx.xxx,如 sysctl net.ipv4.conf.all.rp_filter
改變參數的方式:
第一種:echo value > /proc/xxx/xxx,如 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
第二種:sysctl [-w] variable=value,如 sysctl [-w] net.ipv4.conf.all.rp_filter=1
以上設定系統參數的方式只對當前系統有效,重起系統就沒了,想要保存下來,需要寫入/etc/sysctl.conf文件中
通過執行 man 5 proc可以獲得一些關於proc目錄的介紹
查看系統中的NAT情況
和NAT相關的系統變數
/proc/slabinfo:內核緩存使用情況統計信息(Kernel slab allocator statistics)
/proc/sys/net/ipv4/ip_conntrack_max:系統支持的最大ipv4連接數,默認65536(事實上這也是理論最大值)
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 已建立的tcp連接的超時時間,默認432000,也就是5天
和NAT相關的狀態值
/proc/net/ip_conntrack:當前的前被跟蹤的連接狀況,nat翻譯表就在這里體現(對於一個網關為主要功能的Linux主機,裡面大部分信息是NAT翻譯表)
/proc/sys/net/ipv4/ip_local_port_range:本地開放埠范圍,這個范圍同樣會間接限制NAT表規模
cat /proc/sys/net/ipv4/ip_conntrack_max
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
cat /proc/net/ip_conntrack
cat /proc/sys/net/ipv4/ip_local_port_range
wc -l /proc/net/ip_conntrack
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print 2;}'
grep ip_conntrack /proc/slabinfo | grep -v expect | awk '{print 3;}'
cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10
cat /proc/net/ip_conntrack | perl -pe s/^(.*?)src/src/g | cut -d ' ' -f1 | cut -d '=' -f2 | sort | uniq -c | sort -nr | head -n 10
❷ 45 個 Git 經典操作場景,專治不會合代碼-
git 對於大家應該都不太陌生,熟練使用git已經成為程序員的一項基本技能,盡管在工作中有諸如 Sourcetree 這樣牛X的客戶端工具,使得合並代碼變的很方便。但找工作面試和一些需彰顯個人實力的場景,仍然需要我們掌握足夠多的git命令。
下邊我們整理了45個日常用git合代碼的經典操作場景,基本覆蓋了工作中的需求。
如果你用 git commit -a 提交了一次變化(changes),而你又不確定到底這次提交了哪些內容。你就可以用下面的命令顯示當前 HEAD 上的最近一次的提交(commit):
或者
如果你的提交信息( commit message )寫錯了且這次提交(commit)還沒有推(push), 你可以通過下面的方法來修改提交信息( commit message ):
這會打開你的默認編輯器, 在這里你可以編輯信息. 另一方面, 你也可以用一條命令一次完成:
如果你已經推(push)了這次提交(commit), 你可以修改這次提交(commit)然後強推( force push ), 但是不推薦這么做。
如果這只是單個提交(commit),修改它:
如果你需要修改所有 歷史 , 參考 'git filter-branch'的指南頁.
通過下面的方法,從一個提交(commit)里移除一個文件:
這將非常有用,當你有一個開放的補丁( open patch ),你往上面提交了一個不必要的文件,你需要強推( force push )去更新這個遠程補丁。
如果你需要刪除推了的提交( pushed commits ),你可以使用下面的方法。可是,這會不可逆的改變你的 歷史 ,也會搞亂那些已經從該倉庫拉取(pulled)了的人的 歷史 。簡而言之,如果你不是很確定,千萬不要這么做。
如果你還沒有推到遠程, 把Git重置(reset)到你最後一次提交前的狀態就可以了(同時保存暫存的變化):
這只能在沒有推送之前有用. 如果你已經推了, 唯一安全能做的是 git revert SHAofBadCommit , 那會創建一個新的提交(commit)用於撤消前一個提交的所有變化(changes);或者, 如果你推的這個分支是rebase-safe的 (例如:其它開發者不會從這個分支拉), 只需要使用 git push -f 。
同樣的警告:不到萬不得已的時候不要這么做.
或者做一個 互動式rebase 刪除那些你想要刪除的提交(commit)里所對應的行。
注意, rebasing(見下面)和修正(amending)會用一個 新的提交(commit)代替舊的 , 所以如果之前你已經往遠程倉庫上推過一次修正前的提交(commit),那你現在就必須強推( force push ) ( -f )。注意 – 總是 確保你指明一個分支!
一般來說, 要避免強推 . 最好是創建和推(push)一個新的提交(commit),而不是強推一個修正後的提交。後者會使那些與該分支或該分支的子分支工作的開發者,在源 歷史 中產生沖突。
如果你意外的做了 git reset --hard , 你通常能找回你的提交(commit), 因為Git對每件事都會有日誌,且都會保存幾天。
你將會看到一個你過去提交(commit)的列表, 和一個重置的提交。選擇你想要回到的提交(commit)的SHA,再重置一次:
這樣就完成了。
一般來說, 如果你想暫存一個文件的一部分, 你可這樣做:
-p 簡寫。這會打開交互模式, 你將能夠用 s 選項來分隔提交(commit);然而, 如果這個文件是新的, 會沒有這個選擇, 添加一個新文件時, 這樣做:
然後, 你需要用 e 選項來手動選擇需要添加的行,執行 git diff --cached 將會顯示哪些行暫存了哪些行只是保存在本地了。
git add 會把整個文件加入到一個提交. git add -p 允許互動式的選擇你想要提交的部分.
多數情況下,你應該將所有的內容變為未暫存,然後再選擇你想要的內容進行commit。但假定你就是想要這么做,這里你可以創建一個臨時的commit來保存你已暫存的內容,然後暫存你的未暫存的內容並進行stash。然後reset最後一個commit將原本暫存的內容變為未暫存,最後stash pop回來。
注意1: 這里使用 pop 僅僅是因為想盡可能保持冪等。注意2: 假如你不加上 --index 你會把暫存的文件標記為為存儲。
如果你只是想重置源(origin)和你本地(local)之間的一些提交(commit),你可以:
重置某個特殊的文件, 你可以用文件名做為參數:
如果你想丟棄工作拷貝中的一部分內容,而不是全部。
簽出(checkout)不需要的內容,保留需要的。
另外一個方法是使用 stash , Stash所有要保留下的內容, 重置工作拷貝, 重新應用保留的部分。
或者, stash 你不需要的部分, 然後stash drop。
這是另外一種使用 git reflog 情況,找到在這次錯誤拉(pull) 之前HEAD的指向。
重置分支到你所需的提交(desired commit):
完成。
先確認你沒有推(push)你的內容到遠程。
git status 會顯示你領先(ahead)源(origin)多少個提交:
一種方法是:
在main下創建一個新分支,不切換到新分支,仍在main下:
把main分支重置到前一個提交:
HEAD^ 是 HEAD^1 的簡寫,你可以通過指定要設置的 HEAD 來進一步重置。
或者, 如果你不想使用 HEAD^ , 找到你想重置到的提交(commit)的hash( git log 能夠完成), 然後重置到這個hash。使用 git push 同步內容到遠程。
例如, main分支想重置到的提交的hash為 a13b85e :
簽出(checkout)剛才新建的分支繼續工作:
假設你正在做一個原型方案(原文為working spike (see note)), 有成百的內容,每個都工作得很好。現在, 你提交到了一個分支,保存工作內容:
當你想要把它放到一個分支里 (可能是 feature , 或者 develop ), 你關心是保持整個文件的完整,你想要一個大的提交分隔成比較小。
假設你有:
我去可以通過把內容拿到你的分支里,來解決這個問題:
這會把這個文件內容從分支 solution 拿到分支 develop 里來:
然後, 正常提交。
假設你有一個 main 分支, 執行 git log , 你看到你做過兩次提交:
讓我們用提交hash(commit hash)標記bug ( e3851e8 for #21, 5ea5173 for #14).
首先, 我們把 main 分支重置到正確的提交( a13b85e ):
現在, 我們對 bug #21 創建一個新的分支:
接著, 我們用 _cherry-pick_ 把對 bug #21 的提交放入當前分支。這意味著我們將應用(apply)這個提交(commit),僅僅這一個提交(commit),直接在HEAD上面。
這時候, 這里可能會產生沖突, 參見互動式 rebasing 章 沖突節 解決沖突.
再者, 我們為bug #14 創建一個新的分支, 也基於 main 分支
最後, 為 bug #14 執行 cherry-pick :
一旦你在github 上面合並(merge)了一個 pull request , 你就可以刪除你fork里被合並的分支。如果你不準備繼續在這個分支里工作, 刪除這個分支的本地拷貝會更干凈,使你不會陷入工作分支和一堆陳舊分支的混亂之中。
如果你定期推送到遠程, 多數情況下應該是安全的,但有些時候還是可能刪除了還沒有推到遠程的分支。讓我們先創建一個分支和一個新的文件:
添加文件並做一次提交
現在我們切回到主(main)分支,『不小心的』刪除 my-branch 分支
在這時候你應該想起了 reflog , 一個升級版的日誌,它存儲了倉庫(repo)裡面所有動作的 歷史 。
正如你所見,我們有一個來自刪除分支的提交hash(commit hash),接下來看看是否能恢復刪除了的分支。
看! 我們把刪除的文件找回來了。Git的 reflog 在rebasing出錯的時候也是同樣有用的。
刪除一個遠程分支:
你也可以:
刪除一個本地分支:
首先, 從遠程拉取(fetch) 所有分支:
假設你想要從遠程的 daves 分支簽出到本地的 daves
( --track 是 git checkout -b [branch] [remotename]/[branch] 的簡寫)
這樣就得到了一個 daves 分支的本地拷貝, 任何推過(pushed)的更新,遠程都能看到.
你可以合並(merge)或rebase了一個錯誤的分支, 或者完成不了一個進行中的rebase/merge。Git 在進行危險操作的時候會把原始的HEAD保存在一個叫ORIG_HEAD的變數里, 所以要把分支恢復到rebase/merge前的狀態是很容易的。
不幸的是,如果你想把這些變化(changes)反應到遠程分支上,你就必須得強推( force push )。是因你快進( Fast forward )了提交,改變了Git 歷史 , 遠程分支不會接受變化(changes),除非強推(force push)。
這就是許多人使用 merge 工作流, 而不是 rebasing 工作流的主要原因之一, 開發者的強推(force push)會使大的團隊陷入麻煩。使用時需要注意,一種安全使用 rebase 的方法是,不要把你的變化(changes)反映到遠程分支上, 而是按下面的做:
假設你的工作分支將會做對於 main 的pull-request。一般情況下你不關心提交(commit)的時間戳,只想組合 所有 提交(commit) 到一個單獨的裡面, 然後重置(reset)重提交(recommit)。確保主(main)分支是最新的和你的變化都已經提交了, 然後:
如果你想要更多的控制, 想要保留時間戳, 你需要做互動式rebase (interactive rebase):
如果沒有相對的其它分支, 你將不得不相對自己的 HEAD 進行 rebase。例如:你想組合最近的兩次提交(commit), 你將相對於 HEAD~2 進行rebase, 組合最近3次提交(commit), 相對於 HEAD~3 , 等等。
在你執行了互動式 rebase的命令(interactive rebase command)後, 你將在你的編輯器里看到類似下面的內容:
所有以 # 開頭的行都是注釋, 不會影響 rebase.
然後,你可以用任何上面命令列表的命令替換 pick , 你也可以通過刪除對應的行來刪除一個提交(commit)。
例如, 如果你想 單獨保留最舊(first)的提交(commit),組合所有剩下的到第二個裡面 , 你就應該編輯第二個提交(commit)後面的每個提交(commit) 前的單詞為 f :
如果你想組合這些提交(commit) 並重命名這個提交(commit) , 你應該在第二個提交(commit)旁邊添加一個 r ,或者更簡單的用 s 替代 f :
你可以在接下來彈出的文本提示框里重命名提交(commit)。
如果成功了, 你應該看到類似下面的內容:
--no-commit 執行合並(merge)但不自動提交, 給用戶在做提交前檢查和修改的機會。 no-ff 會為特性分支(feature branch)的存在過留下證據, 保持項目 歷史 一致。
有時候,在將數據推向上游之前,你有幾個正在進行的工作提交(commit)。這時候不希望把已經推(push)過的組合進來,因為其他人可能已經有提交(commit)引用它們了。
這會產生一次互動式的rebase(interactive rebase), 只會列出沒有推(push)的提交(commit), 在這個列表時進行reorder/fix/squash 都是安全的。
檢查一個分支上的所有提交(commit)是否都已經合並(merge)到了其它分支, 你應該在這些分支的head(或任何 commits)之間做一次diff:
這會告訴你在一個分支里有而另一個分支沒有的所有提交(commit), 和分支之間不共享的提交(commit)的列表。另一個做法可以是:
如果你看到的是這樣:
這意味著你rebase的分支和當前分支在同一個提交(commit)上, 或者 領先(ahead) 當前分支。你可以嘗試:
如果你不能成功的完成rebase, 你可能必須要解決沖突。
首先執行 git status 找出哪些文件有沖突:
在這個例子裡面, README.md 有沖突。打開這個文件找到類似下面的內容:
你需要解決新提交的代碼(示例里, 從中間 == 線到 new-commit 的地方)與 HEAD 之間不一樣的地方.
有時候這些合並非常復雜,你應該使用可視化的差異編輯器(visual diff editor):
在你解決完所有沖突和測試過後, git add 變化了的(changed)文件, 然後用 git rebase --continue 繼續rebase。
如果在解決完所有的沖突過後,得到了與提交前一樣的結果, 可以執行 git rebase --skip 。
任何時候你想結束整個rebase 過程,回來rebase前的分支狀態, 你可以做:
暫存你工作目錄下的所有改動
你可以使用 -u 來排除一些文件
假設你只想暫存某一個文件
假設你想暫存多個文件
這樣你可以在 list 時看到它
或
首先你可以查看你的 stash 記錄
然後你可以 apply 某個 stash
此處, 'n'是 stash 在棧中的位置,最上層的 stash 會是0
除此之外,也可以使用時間標記(假如你能記得的話)。
你需要手動create一個 stash commit , 然後使用 git stash store 。
如果已經克隆了:
如果你想恢復一個已刪除標簽(tag), 可以按照下面的步驟: 首先, 需要找到無法訪問的標簽(unreachable tag):
記下這個標簽(tag)的hash,然後用Git的 update-ref
這時你的標簽(tag)應該已經恢復了。
如果某人在 GitHub 上給你發了一個 pull request , 但是然後他刪除了他自己的原始 fork, 你將沒法克隆他們的提交(commit)或使用 git am 。在這種情況下, 最好手動的查看他們的提交(commit),並把它們拷貝到一個本地新分支,然後做提交。
做完提交後, 再修改作者,參見變更作者。然後, 應用變化, 再發起一個新的 pull request 。
在 OS X 和 Linux 下, 你的 Git的配置文件儲存在 ~/.gitconfig 。我在 [alias] 部分添加了一些快捷別名(和一些我容易拼寫錯誤的),如下:
你可能有一個倉庫需要授權,這時你可以緩存用戶名和密碼,而不用每次推/拉(push/pull)的時候都輸入,Credential helper能幫你。
你把事情搞砸了:你 重置(reset) 了一些東西, 或者你合並了錯誤的分支, 亦或你強推了後找不到你自己的提交(commit)了。有些時候, 你一直都做得很好, 但你想回到以前的某個狀態。
這就是 git reflog 的目的, reflog 記錄對分支頂端(the tip of a branch)的任何改變, 即使那個頂端沒有被任何分支或標簽引用。基本上, 每次HEAD的改變, 一條新的記錄就會增加到 reflog 。遺憾的是,這只對本地分支起作用,且它只跟蹤動作 (例如,不會跟蹤一個沒有被記錄的文件的任何改變)。
上面的reflog展示了從main分支簽出(checkout)到2.2 分支,然後再簽回。那裡,還有一個硬重置(hard reset)到一個較舊的提交。最新的動作出現在最上面以 HEAD@{0} 標識.
如果事實證明你不小心回移(move back)了提交(commit), reflog 會包含你不小心回移前main上指向的提交(0254ea7)。
然後使用 git reset 就可以把main改回到之前的commit,這提供了一個在 歷史 被意外更改情況下的安全網。
❸ 思科路由器配置命令一覽表
思科路由器常用配置命令一覽表:
1、Exec commands:
<1-99> 恢復一個會話
bfe 手工應急模式設置
clear 復位功能
clock 管理系統時鍾
configure 進入設置模式
connect 打開一個終端
從tftp伺服器拷貝設置文件或把設置文件拷貝到tftp伺服器上
debug 調試功能
disable 退出優先命令狀態
disconnect 斷開一個網路連接
enable 進入優先命令狀態
erase 擦除快閃內存
exit 退出exce模式
help 交互幫助系統的描述
lat 打開一個本地傳輸連接
lock 鎖定終端
login 以一個用戶名登錄
logout 退出終端
mbranch 向樹形下端分支跟蹤多路由廣播
mrbranch 向樹形上端分支跟蹤反向多路由廣播
name-connection 給一個存在的網路連接命名
no 關閉調試功能
pad 打開X.29 PAD連接
ping 發送回顯信息
ppp 開始點到點的連接協議
reload 停機並執行冷啟動
resume 恢復一個活動的網路連接
rlogin 打開遠程注冊連接
rsh 執行一個遠端命令
send 發送信息到另外的終端行
setup 運行setup命令
show 顯示正在運行系統信息
slip 開始SLIP協議
start-chat 在命令行上執行對話描述
systat 顯示終端行的信息
telnet 遠程登錄
terminal 終端行參數
test 測試子系統內存和埠
tn3270 打開一個tin3270連接
trace 跟蹤路由到目的地
undebug 退出調試功能
verify 驗證檢查閃爍文件的總數
where 顯示活動的連接
which-route 執行OSI路由表查找並顯示結果
write 把正在運行的設置寫入內存、網路、或終端
x3 在PAD上設置X.3參數
xremote 進入xremote模式
2、#show ?
access-expression 顯示訪問控製表達式
access-lists 顯示訪問控製表
apollo Apollo 網路信息
appletalk Apple Talk 信息
arap 顯示Appletalk 遠端通道統計
arp 地址解析協議表
async 訪問路由介面的終端行上的信息
bridge 前向網路資料庫
buffers 緩沖池統計
clns CLNS網路信息
clock 顯示系統時鍾
cmns 連接模式網路服務信息
compress 顯示壓縮狀態
configuration 非易失性內存的內容
controllers 埠控制狀態
debugging 調試選項狀態
decnet DEC網路信息
dialer 撥號參數和統計
dnsix 顯示Dnsix/DMPP信息
entry 排隊終端入口
extended 擴展埠信息
flash 系統閃爍信息
flh-log 閃爍裝載幫助日誌緩沖區
frame-relay 幀中繼信息
history 顯示對話層歷史命令
hosts IP域名,查找方式,名字服務,主機表
interfaces 埠狀態和設置
ip IP信息
ipx Novell IPX信息
isis IS-IS路由信息
keymap 終端鍵盤映射
lat DEC LAT信息
line 終端行信息
llc2 IBM LLC2 環路信息
lnm IBM 局網管理
local-ack 本地認知虛環路
memory 內存統計
netbios-cache NetBios命名緩沖存貯器內存
node 顯示已知LAT節點
ntp 網路時間協議
processes 活動進程統計
protocols 活動網路路由協議
queue 顯示隊列內容
queueing 顯示隊列設置
registry 功能注冊信息
rhosts 遠程主機文件
rif RIF存貯器入口
route-map 路由器信息
sdlle 顯示sdlc-llc2轉換信息
services 已知LAT服務
sessions 遠程連接信息
smds SMDS信息
source-bridge 源網橋參數和統計
spanning-tree 跨越樹形拓樸
stacks 進程堆棧應用
standby 熱支持協議信息
stun STUN狀態和設置
subsystem 顯示子系統
tcp TCP連接狀態
terminal 顯示終端設置
tn3270 TN3270 設置
translate 協議轉換信息
ttycap 終端容易表
users 顯示終端行的信息
version 系統硬、軟體狀態
vines VINES信息
whoami 當前終端行信息
x25 X.25信息
xns XNS信息
xermote Xremote統計
3、#config ?
Memory 從非易失性內存設置
Network 從TFTP網路主機設置
Overwrite-network 從TFTP網路主機設置覆蓋非易失性內存
Terminal 從終端設置
4、Configure commads:
Access-list 增加一個訪問控制域
Apollo Apollo全局設置命令
appletalk Appletalk 全局設置命令
arap Appletalk遠程進出協議
arp 設置一個靜態ARP入口
async-bootp 修改系統啟動參數
autonomous-system 本地所擁有的特殊自治系統成員
banner 定義注冊顯示信息
boot 修改系統啟動時參數
bridge 透明網橋
buffers 調整系統緩沖池參數
busy-message 定義當連接主機失敗時顯示信息
chat-script 定義一個數據機對話文本
clns 全局CLNS設置子命令
clock 設置時間時鍾
config-register 定義設置寄存器
decnet 全局DEC網路設置子命令
default-value 預設字元位值
dialer-list 創建一個撥號清單入口
dnsix-nat 為審計提供DMDM服務
enable 修改優先命令口令
end 從設置模式退出
exit 從設置模式退出
frame-relay 全局幀中繼設置命令
help 交互幫助系統的描述
hostname 設置系統網路名
iterface 選擇設置的埠
ip 全局地址設置子命令
ipx Novell/IPX全局設置命令
keymap 定義一個新的鍵盤映射
lat DEC本地傳輸協議
line 設置終端行
lnm IBM局網管理
locaddr-priority-list 在LU地址上建立優先隊列
logging 修改注冊(設備)信息
login-string 定義主機指定的注冊字元串
map-class 設置靜態表類
map-list 設置靜態表清單
menu 定義用戶介面菜單
mop 設置DEC MOP伺服器
netbios NETBIOS通道控制過濾
no 否定一個命令或改為預設設置
ntp 設置NTP
priority-list 建立特權列表
prompt 設置系統提示符
queue-list 建立常規隊列列表
rcmd 遠程命令設置命令
rcp-enable 打開Rep服務
rif 源路由進程
router-map 建立路由表或進入路由表命令模式
router 打開一個路由進程
rsh-enable 打開一個RSH服務
sap-priority-list 在SAP或MAC地址上建立一個優先隊列
service 修改網路基本服務
snmp-server 修改SNMP參數
state-machine 定義一個TCP分配狀態的機器
stun STUN全局設置命令
tacacs-server 修改TACACS隊列參數
terminal-queue 終端隊列命令
tftp-server 為網路裝載請求提供TFTP服務
tn3270 tn3270設置命令
translate 解釋全局設置命令
username 建立一個用戶名及其許可權
vines VINES全局設置命令
x25 X.25 的第三級
x29 X.29 命令
xns XNS 全局設置命令
xremote 設置Xremote
5、(config)#ip
Global IP configuration subcommands:
Accounting-list 選擇保存IP記帳信息的主機
Accounting-threshold 設置記帳入口的最大數
accounting-transits 設置通過入口的最大數
alias TCP埠的IP地址取別名
as-path BGP自治系統路徑過濾
cache-invalidate-delay 延遲IP路由存貯池的無效
classless 跟隨無類前向路由規則
default-network 標志網路作為預設網關候選
default-gateway 指定預設網(如果沒有路由IP)
domain-list 完成無資格主機的域名
domain-lookup 打開IP域名服務系統主機轉換
domain-name 定義預設域名
forward-protocol 控制前向的、物理的、直接的IP廣播
host 為IP主機表增加一個入口
host-routing 打開基於主機的路由(代理ARP和再定向)
hp-host 打開HP代理探測服務
mobile-host 移動主機資料庫
multicast-routing 打開前向IP
name-server 指定所用名字伺服器的地址
ospf-name-lookup 把OSPF路由作為DNS名顯示
pim PIM 全局命令
route 建立靜態路由
routing 打開IP路由
security 指定系統安全信息
source-route 根據源路由頭的選擇處理包
subnet-zero 允許子網0子網
tcp 全局TCP參數
❹ linux系統常用命令有哪些
安裝和登錄命令:login 、shutdown 、halt 、reboot 、mount 、umount 、chsh
文件處理命令:file 、mkdir 、grep 、dd 、find 、mv 、ls 、diff 、cat 、ln
網路操作命令:ifconfig 、ip 、ping 、netstat 、telnet 、ftp 、route 、rlogin rcp 、finger
、mail 、nslookup
系統安全相關命令:passwd 、su 、umask 、chgrp 、chmod 、chown 、chattr、sudo、pswho
系統管理相關命令:df 、top 、free 、quota 、at 、lp 、 adser 、groupadd kill 、 crontab 、tar
、unzip 、gunzip 、last
❺ android adb指令有什麼優點
Android adb指令的優點如下:
1.Android 調試橋(adb)是多種用途的工具,該工具可以幫助方便的管理設備或模擬器 的狀態。可以快速的通過shell端使用adb命令啟動客戶端。 其他Android工具比如說ADT插件和DDMS同樣可以產生adb客戶端.
2.給特定的模擬器/設備實例發送命令。
如果有多個模擬器/設備實例在運行,在發布adb命令時需要指定一個目標實例。 這樣做,請使用-s 選項的命令。在使用的-s 選項是:adb -s <serialNumber> <command>
如上所示,給一個命令指定了目標實例,這個目標實例使用由adb分配的序列號。
3.可以通過簡單的指令安裝軟體到設備上。
可以使用adb從你的開發電腦上復制一個應用程序,並且將其安裝在一個模擬器/設備實例。像這樣做,使用install 命令。這個install 命令要求你必須指定你所要安裝的.apk文件的路徑:adb install <path_to_apk>
4.轉發埠。
可以使用 forward 命令進行任意埠的轉發——一個模擬器/設備實例的某一特定主機埠向另一不同埠的轉發請求。下面演示了如何建立從主機埠6100到模擬器/設備埠7100的轉發。adb forward tcp:6100 tcp:7100
5.從模擬器/設備中拷入或拷出文件。
可以使用adbpull ,push 命令將文件復制到一個模擬器/設備實例的數據文件或是從數據文件中復制。install 命令只將一個.apk文件復制到一個特定的位置,與其不同的是,pull 和 push 命令可令你復制任意的目錄和文件到一個模擬器/設備實例的任何位置。
從模擬器或者設備中復制文件或目錄,使用(如下命):adb pull <remote> <local>